请教WaitForSingleObject的用法(50分)

  • 主题发起人 主题发起人 zytzjx
  • 开始时间 开始时间
Z

zytzjx

Unregistered / Unconfirmed
GUEST, unregistred user!
是这样的,我是用串口的那个ActiveX控件TMSComm,这样我简单写一代码
procedure Form1.SendDate;
begin
...
comm1.Output := sendStream;
WaitForSingleObject(hEvent, 10000);
....
//这儿要用到comm1返回的数据做下面工作
end;
procedure TForm1.ComTestComm(Sender: TObject);
begin
if Comm1.CommEvent = 2 then
begin
bRecData := ComTest.Input;
SetEvent(hEvent);
end;
end;
这样就是不行的,全部是超时出来的,我改成WaitForSingleObject(hEvent, INFINITE);
程序就死了。为什么呀,本人在线等。
 
procedure Form1.SendDate;
begin
...
resetevent(hEvent)
comm1.Output := sendStream;
if waitforsingleobject(hEvent, INFINITE)=WAIT_OBJECT_0 then
begin
....
//这儿要用到comm1返回的数据做下面工作
end;
end;
 
迷糊,你说的这种方法是不行的,我试了,
 
为什么呀,在一个线程中不行吗,我试了,不知道用什么方法才行的,因为这个我不想用查询来做,也没有别的东西,开个线程也没有意思,我就想在一个线程中搞定,可以吗,
 
你不能在主线程中使用waitforsingleobject,那样主线程挂起了,谁唤醒他?
你另开一个线程吧,就可以了:)
 
你这样阻碍了主线程,自己创建一个线程吧!
 
就是这个问题呀,有没有解决问题的方法,不用查询与开线程?
 
用查询也都没有办法的,真是的。
用线程还有一个问题是
procedure sss;
begin
form1.comm1.OutPut := fdsa;
WaitForSingleObject(hEvent, INFINITE);
do
something;
end;
procedure Execute;
begin
Synchronize(sss);
//程序也会死了
end;
 
晕!
用线程的话,不用和主线程同步,将SPCOMM声明成线程私有的就可以了,例如
mythread = class(tthread)
private
mycom: tspcomm;
public
procedure GoSetEvent;
......
procedure execute;
begin
mycom.output := fdsa;
WaitForSingleObject(hEvent, INFINITE);
do
something;
end;

procedure GoSetEvent;
begin
SetEvent(hEvent);
end;
 
还有其他方法,就是摒弃SPCOMM,改用TApdPortCom。
不过估计您不会采用:)
 
非常感谢各位的到来,我结帐了。
 
后退
顶部