var
  hThread:Thandle;  //定义一个句柄
  ThreadID:DWord;procedure TForm1.Timer3Timer(Sender: TObject);
begin
  //创建线程,同时线程函数被调用
  hthread:=CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);
  if hThread=0 then
    messagebox(Handle,'Didn’t Create a Thread',nil,MB_OK);
end;function MyThreadFunc(P:pointer):Longint;stdcall;
var
   DC:HDC;
   S:string;
  buffer : array[0..255] of char;
  ret : integer;
  i,j,msr_key,m,k: integer;
  rec_txt,msr_flag,tirm_flag:string;
begin
    begin
      form1.IdUdpclient1.Send(form1.caption+'请求数据');
      ret := form1.IdUdpClient1.ReceiveBuffer(buffer,255,3000);// 等待接收数据.
      if ret > 0 then
        begin
          msr_flag:='0';
          tirm_flag:='0';
          form1.memo1.Text:='';
          form1.memo1.Lines.add(buffer);
          rec_txt:=form1.memo1.Text;
          for k:=0 to form1.ListBox1.Items.Count-1 do
            begin
              if trim(copy(rec_txt,14,13))=form1.listbox1.Items[k] then
                tirm_flag:='1';
            end;
          if tirm_flag='0' then
            form1.listbox1.Items.Add(trim(copy(rec_txt,14,13)));
         end;
    end;
end;后来加上这个也不行
procedure TForm1.FormDestroy(Sender: TObject);
var
  retCode:    DWORD;
begin
  if hThread <> 0 then
  begin
    While True Do
    Begin
        if not GetExitCodeThread(hThread,retCode) then
          break;
        If retCode <> STILL_ACTIVE Then
            Break;
        Application.ProcessMessages;
    End;
  end;
end;
为什么在关闭的时候出问题,请告诉我一下.

解决方案 »

  1.   

    如果你用delphi提供的TThread來做線程, 比較簡單點
      

  2.   

    indy 本來應該自身就提供處理線程的, 你這樣做, 直接調用主窗體的資源, 可能達不到真正多線程的作用!然後, 最後, 你又沒有調用
    ExitThread 來結束線程!再說, 你這個線程, 裹面還要加
    sleep(100); 這類的, 要不然, 太快了!處理有問題
      

  3.   

    为什么这个关不掉,我看别人在里面放一个循环就没有问题.
    function MyThreadFunc(P:pointer):Longint;stdcall;
    var
       i:integer;
       DC:HDC;
       S:string;
    begin
         DC:=GetDC(Form1.Handle);
         for i:=0 to 100000 do begin
             S:=Inttostr(i);
             Textout(DC,10,10,Pchar(S),length(S));
         end;
         ReleaseDC(Form1.Handle,DC);
    end;
      

  4.   

    我是15秒触发一次,另外如果用sleep(15000)的话,很占资源.