Delphi: по непонятным мне причинам виснет приложение
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
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='<Введите ваш ник>') 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. В общем, помогите людям, отпишитесь, если знаете, где допущена ошибка и как её исправить. Заранее благодарен.
|
|
|
RE: Delphi: по непонятным мне причинам виснет приложение - 2008-04-16 20:00:54.300000
|
|
|
DeCoder
Сообщений: 209
Оценки: 0
Присоединился: 2007-10-29 15:09:04.486666
|
Новое обстоятельство: если приложение загружает проч на 0%, а точнее, не загружает его совсем, то оно виснет при нажатии "ОК" с шансом 70%. Как заставить приложение грузить проц хоть немнго?).
|
|
|
RE: Delphi: по непонятным мне причинам виснет приложение - 2008-04-16 20:50:42.816666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Сделать бесконечный цикл в отдельном потоке.
|
|
|
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-порт?
|
|
|
|
|