最近在做一个多串口通信的软件,多线程调用一个串口通信的COM组件.基本思路是:因为初始化串口需要较长时间,所以,首先动态的创建多个挂起的线程并保存在线程数组里.然后当有数据需要发送时,从线程数组中选择一个,设置需要传输的信息内容,然后RESUME线程,并将线程从数组里删除.当线程完成工作后,触发主线程的ThreadDone事件,然后主线程将其添加到数组中去.
可是在线程被RESUME后,总是不能触发ThreadDone事件,哪位高手做过类似的项目啊?请指教!
public
  { Public declarations }
    comportcount:Integer;
    ComPortDeviceArray:array of TNewComPortDevice;
    procedure ThreadDone(Sender: TObject);
procedure Tfrm_main.btn_initClick(Sender: TObject);
var
i:integer;
ComPortDevice:TNewComPortDevice;
begin
  btn_init.Enabled:=False;
  comportcount:=StrToInt(edt_comportcount.Text);
  setlength(ComPortDeviceArray,comportcount);
  UseAblePortCount:=comportcount;
  for i:= 0 to  comportcount-1 do
  begin
    ComPortDevice:=TNewComPortDevice.create(i+1);
    ComPortDevice.OnTerminate:=ThreadDone;
    ComPortDeviceArray[i]:=ComPortDevice;
  end; 
  btn_send.Enabled:=True;
end;procedure Tfrm_main.ThreadDone(Sender: TObject);
begin
 ....
  btn_send.Enabled:=True;
end;procedure Tfrm_main.btn_sendClick(Sender: TObject);
begin
  btn_send.Enabled:=False;
 ...
 ComPortDevice.msg:='aabbccdd';
  ComPortDevice.Resume;
end;
//这是线程的创建函数
constructor TNewComDevice.create(comport: Integer);
begin
  Fcomport:=comport;
  FreeOnTerminate := False;
  inherited Create(true);
  ComDevice := createoleobject('ComDevice.ComDevice1');
  ComDevice.Connect(1, 19200);
end;
//这是线程的执行函数.用sleep (500)和ComDevice .SendMsg(  Msg);都触发不了ThreadDone消息
procedure TNewsms.Execute;
var
i:Integer;
begin
  sleep (500);
  //ComDevice .SendMsg(  Msg);
 
  { Place thread code here }
end;

解决方案 »

  1.   

    那就给主线程直接发自己定义的windows消息总行了吧^_^ 
      

  2.   

    搞个断点,看看有没有被Resume,我上次在做线程程序时,用了while (suspanded)do rusume;才唤醒线程,原因未明^_^。
      

  3.   

    我跟踪了,线程确实被唤醒了,不过后来又看了一下,发现有可能是com组件的问题,因为组件好像也是异步的,组件的sendmsg函数执行后实际上又开了一个线程,我看了一下delphi 的线程窗口,里面显示一共有6个线程,这种情况应该怎么调试阿?
    另外我查资料,看有些资料上说com组件调用前要先coinintal一下?是不是和这个也有关系阿?
    如果自己发消息的话,怎么确定发消息的是哪个线程啊?
    因为ThreadDone有sender 参数,我是用ComPortDeviceArray[i]:= (sender as ComPortDevice)这样的形式来做的
      

  4.   

    有一个API叫做 WaitForSingleObject
    你可以看看
      

  5.   

    我上网上查了一些资料,也知道了WaitForSingleObject的参数,可是还是不知道应该怎么解决啊?
    能给举个例子吗?
        不好意思,刚开始做串口编程,谢谢各位了
      

  6.   

    WaitForSingleObject
    好象是处理进程的...