|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Thread error handle invalid (6) ?
Hi Friedns , What is this handle is invalid error (6). , I press the button suspended , but fails after 30 seconds.
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, IdAntiFreezeBase, IdAntiFreeze, AdvSmoothProgressBar, BusinessSkinForm, bsSkinData, bsSkinCtrls; type TForm1 = class(TForm) Button4: TButton; IdAntiFreeze1: TIdAntiFreeze; Label13: TLabel; Label12: TLabel; Label11: TLabel; AdvProgressBar1: TAdvSmoothProgressBar; bsSkinData1: TbsSkinData; bsCompressedStoredSkin1: TbsCompressedStoredSkin; bsBusinessSkinForm1: TbsBusinessSkinForm; Button1: TbsSkinSpeedButton; Button2: TbsSkinSpeedButton; button3: TbsSkinSpeedButton; IdHTTP: TIdHTTP; procedure Button4Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure IdHTTPWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); procedure IdHTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); procedure bsSkinSpeedButton1Click(Sender: TObject); procedure bsSkinSpeedButton2Click(Sender: TObject); procedure bsSkinSpeedButton3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; f: TFileStream; success: Boolean; implementation uses Unit2; var NewThread: TTestThread; {$R *.DFM} procedure TForm1.Button4Click(Sender: TObject); begin F := TFileStream.Create('dd.exe', fmCreate); F.Seek(0,soFromEnd); try IdHTTP.Get('http://mydezo.com/deneme.exe', F); except showmessage('Dosya Bulunamadı'); end; FreeAndNil(F); F.Free; end; procedure TForm1.FormCreate(Sender: TObject); begin application.ProcessMessages; end; procedure TForm1.IdHTTPWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); begin if AWorkMode = wmRead then begin AdvProgressBar1.Position := AWorkCount ; Label12.Caption := floatToStr(round(advProgressBar1.Position * 100 / advProgressBar1.Maximum)) + ' ' + '%' ; //yüzde Label13.Caption := IntToStr(AWorkCount div 1024) + ' '; end; end; procedure TForm1.IdHTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); begin if AWorkMode = wmRead then begin AdvProgressBar1.Maximum := AWorkCountMax ; AdvProgressBar1.Position := 0 ; if AWorkCountMax>0 then Label11.Caption:=Inttostr(AWorkCountMax div 1024) + ' '; end end; procedure TForm1.bsSkinSpeedButton1Click(Sender: TObject); begin NewThread:=TTestThread.Create(False); end; procedure TForm1.bsSkinSpeedButton2Click(Sender: TObject); begin Button3.Enabled:=True; Button2.Enabled:=False; NewThread.Suspend; end; procedure TForm1.bsSkinSpeedButton3Click(Sender: TObject); begin Button2.Enabled:=True; Button3.Enabled:=False; NewThread.Resume; end; end. Код:
unit Unit2; interface uses Classes, Unit1, Windows, Messages, SysUtils; type TTestThread = class(TThread) private protected procedure Execute; override; end; implementation procedure TTestThread.Execute; begin FreeOnTerminate:=true; form1.Button4.Click; end; end. please help me friends Последний раз редактировалось alyamus, 12.02.2014 в 22:57. |
#2
|
||||
|
||||
use TThread.Synchronize or user message
(Is it better to use TThread's ”Synchronize” or use Window Messages for IPC between main and child thread?) when working with VCL components from child thread Понять, что хочет заказчик - бесценно, ведь он платит MasterCard |
#3
|
|||
|
|||
The problem is diferent.
It is in your thread. You created thread and set it to terminate on finish... ...and you do not have loop inside. The main thread procedure (Execute) went to the finish and thread commit the suicide The code in the thread should look like the following: Код:
procedure TTestThread.Execute; begin FreeOnTerminate:=true; While not Terminated do begin form1.Button4.Click; end; end; |