Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Delphi: по непонятным мне причинам виснет приложение

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Delphi: по непонятным мне причинам виснет приложение
Имя
Сообщение << Старые топики   Новые топики >>
Delphi: по непонятным мне причинам виснет приложение - 2008-04-16 16:41:09.743333   
DeCoder

Сообщений: 209
Оценки: 0
Присоединился: 2007-10-29 15:09:04.486666
Помните, я писал про книгу "Delphi глазами Хакера"?
Дак вот. 1 человек занялся сразу написанием лакального чата). Всё как положено, создал 2 мода (юзерский и админский), добавил кое-чего своего. Но при тесте на старых машинах(на них стит ХР, но мощность ядра не больше 480 Мгц) приложение(причём, оба мода) виснет по непонятным причинам. Он обратился ко мне - я тож не пойму в чём дело. Что-то не то он намудрил с richedit'ом наверно - когда дабавил написание времени перед соощением - потому, что иногда должный текст(время) вообще не пишется(label.capton не успевает обновляться); иногда компилятор ругается на событие onTimer; но ингда приложение работает! только бывает это раз из 25.

Ещё: само приложение виснет посла нажатия "ОК"(Uses1; procedure TForm1.Button1Click).



В общем, вот исходники(само приложение выложить не могу - весит много, а у меня с нетом напряг - дисконнект через каждые 40 сек.).
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Edit1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses Unit2, Unit3; {uses Unit2;} {uses Unit2;} {$R *.dfm} procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Form1.Hide; end; procedure TForm1.Button2Click(Sender: TObject); begin Form1.Close; end; procedure TForm1.Button1Click(Sender: TObject); begin If (form1.Edit1.text=form2.label2.caption) or (form1.Edit1.text='&lt;Введите ваш ник&gt;') then ShowMessage('Введите ваш ник') else Begin Form2.Label2.caption:=Form1.Edit1.Text; if Form3.CheckBox1.State=cbChecked then Form2.Client1.Send('System message: '+'(Admin)'+'"'+Form1.Edit1.Text+'"'+'зашёл в Chat') else Form2.Client1.Send('"'+Form1.Edit1.Text+'"'+'зашёл в Chat'); Form2.RichEdit1.lines.add('['+Form2.label4.Caption+']'+' System message: '+' Добро пожаловать в Chat, '+Form1.Edit1.Text); Form2.Show; Form1.Hide; Form1.Button2.Visible:=false; end; end; procedure TForm1.Edit1Click(Sender: TObject); begin Form1.Edit1.Text:=''; end; procedure TForm1.Button3Click(Sender: TObject); begin Form1.Hide; end; procedure TForm1.Button4Click(Sender: TObject); begin Form3.show; end; procedure TForm1.Button5Click(Sender: TObject); begin Form2.Client1.Send('"'+Form2.Label2.Caption+'"'+' сменил ник на '+'"'+Form1.Edit1.Text+'"'); end; end.




unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient,IdSocketHandle, Buttons, ComCtrls, ExtCtrls, XPMan; type TForm2 = class(TForm) Button1: TButton; Label3: TLabel; Client1: TIdUDPClient; Server1: TIdUDPServer; Button2: TButton; BitBtn1: TBitBtn; RichEdit2: TRichEdit; Timer1: TTimer; Label4: TLabel; RichEdit1: TRichEdit; Label2: TLabel; XPManifest1: TXPManifest; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1Click(Sender: TObject); procedure Server1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; implementation uses Unit1, Unit3; {$R *.dfm} procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Form1.close; end; procedure TForm2.Timer1Timer(Sender: TObject); begin Form2.Label4.Caption:=TimeToStr(Time); end; procedure TForm2.Button1Click(Sender: TObject); begin if Form3.CheckBox1.State=cbChecked then Client1.Send('(Admin) '+Form2.Label2.Caption+': '+RichEdit2.text) else Client1.Send(Form2.Label2.Caption+': '+RichEdit2.text); form2.RichEdit2.text:=''; end; procedure TForm2.Server1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); var SFS: TStringStream; s: String; begin SFS:=TStringStream.Create(''); SFS.CopyFrom(AData, AData.Size); RichEdit1.lines.Add('['+Form2.label4.Caption+']'+ABinding.PeerIP+' '+SFS.DataString); ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s[1], Length(s)); SFS.Free; end; procedure TForm2.Button2Click(Sender: TObject); begin Form1.Edit1.Text:=Form2.Label2.Caption; Form1.show; form1.Button1.Visible:=false; Form1.Button3.visible:=true; Form1.Button2.visible:=false; Form1.Button4.visible:=false; Form1.Button5.Visible:=true; form1.Height:=98; end; procedure TForm2.Button3Click(Sender: TObject); begin Form3.show; end; procedure TForm2.BitBtn1Click(Sender: TObject); begin Form3.Show; end; end.



unit Unit3; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Spin; type TForm3 = class(TForm) Label1: TLabel; Button1: TButton; Button2: TButton; Button3: TButton; Edit1: TEdit; CheckBox1: TCheckBox; procedure Button1Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form3: TForm3; implementation uses Unit2; {$R *.dfm} procedure TForm3.Button1Click(Sender: TObject); begin Form3.Hide; end; procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction); begin Form3.Hide; end; procedure TForm3.Button3Click(Sender: TObject); begin Form3.Hide; Form2.Client1.Host:=Form3.Edit1.text; end; procedure TForm3.Button2Click(Sender: TObject); begin Form2.Client1.Host:=Form3.Edit1.text; end; end.



В общем, помогите людям, отпишитесь, если знаете, где допущена ошибка и как её исправить.

Заранее благодарен.

Post #: 1
RE: Delphi: по непонятным мне причинам виснет приложение - 2008-04-16 20:00:54.300000   
DeCoder

Сообщений: 209
Оценки: 0
Присоединился: 2007-10-29 15:09:04.486666
Новое обстоятельство: если приложение загружает проч на 0%, а точнее, не загружает его совсем, то оно виснет при нажатии "ОК" с шансом 70%.
Как заставить приложение грузить проц хоть немнго?).
Post #: 2
RE: Delphi: по непонятным мне причинам виснет приложение - 2008-04-16 20:50:42.816666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Сделать бесконечный цикл в отдельном потоке.
Post #: 3
RE: Delphi: по непонятным мне причинам виснет приложение - 2008-04-17 06:59:03.666666   
DeCoder

Сообщений: 209
Оценки: 0
Присоединился: 2007-10-29 15:09:04.486666
Хы).
Компы старые. тогда зависнет комп а не приложение).
хотя… если кнопка нажата, то запускать таймер 5 сек, который в свою очередь изменяет значение переменной(если исп. цикл "пока"). можно попробовать.
но это всё равно не вариант.

З.Ы. ещё вопрос:как осуществить перебор свободных на машине UDP-портов? Всысле, цикл перебора с 1 по 65 000 до 1 свободного порта? какой ответ должен быть от машины и как проверить: занят-ли UDP-порт?
Post #: 4
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Delphi: по непонятным мне причинам виснет приложение







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.