机器有4个COM串口程序开启四个线程,一个线程对应一个串口,每个线程的操作内容都是从数据库表里取。 问题是: 假如20条数据就用四个线程来处理, 就得循环5次。 每写一个COM数据,得四个线程写成功了才能下一轮操作.若有人提供算法,多线程技术. 本人提供1000分, 并赠送1000元作为酬劳

解决方案 »

  1.   

    今天寫得太多了。提供思路,不知道是否合適,寫一個監界向量或者 CreateEvent 建產一個Event WaitSingleObject 等待成功再觸發下一步的操作。
      

  2.   

    使用线程同步,可以通过临界区,信号量等方法保持同步。
    猛料中的一段代码,供参考。
    unit comdemou;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;constWm_commNotify=Wm_User+12;type TForm1 = class(TForm)procedure FormCreate(Sender: TObject); privateProcedure comminitialize;Procedure MsgcommProcess(Var Message:Tmessage); Message Wm_commnotify;{ Private declarations } public{ Public declarations } end; //线程声明 TComm=Class(TThread) protectedprocedure Execute;override; end;var Form1: TForm1; hcom,Post_Event:Thandle; lpol:Poverlapped;implementation{$R *.DFM}Procedure TComm.Execute;//线程执行过程vardwEvtMask:Dword;Wait:Boolean;Beginfillchar(lpol,sizeof(toverlapped),0);While True do Begin dwEvtMask:=0; Wait:=WaitCommEvent(hcom,dwevtmask,lpol); //等待串行口事件; if Wait Then Beginwaitforsingleobject(post_event,infinite);  //等待同步事件置位;resetevent(post_event);//同步事件复位;PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);//发送消息;end; end;end;procedure Tform1.comminitialize;//串行口初始化varlpdcb:Tdcb;Beginhcom:=createfile(‘com2’,generic_read or generic_write,0,nil,open_existing, file_attribute_normal or file_flag_overlapped,0);//打开串行口if hcom=invalid_handle_value thenelsesetupcomm(hcom,4096,4096); //设置输入、输出缓冲区皆为4096字节getcommstate(hcom,lpdcb);//获取串行口当前默认设置lpdcb.baudrate:=2400;lpdcb.StopBits:=1;lpdcb.ByteSize:=8;lpdcb.Parity:=EvenParity;//偶校验Setcommstate(hcom,lpdcb);setcommMask(hcom,ev_rxchar); //指定串行口事件为接收到字符;end;Procedure TForm1.MsgcommProcess(Var Message:Tmessage);varClear:Boolean;Coms:Tcomstat;cbNum,ReadNumber,lpErrors:Integer;Read_Buffer:array[1..100]of char;BeginClear:=Clearcommerror(hcom,lpErrors,@Coms);if Clear Then Begin  cbNum:=Coms.cbInQue;  ReadFile(hCom,Read_Buffer,cbNum,ReadNumber,lpol);  //处理接收数据  SetEvent(Post_Event);//同步事件置位  end;end;procedure TForm1.FormCreate(Sender: TObject);begincomminitialize;post_event:=CreateEvent(nil,true,true,nil); //创建同步事件;Tcomm.Create(False);//创建串行口监视线程;end;end. 
      

  3.   

    每个通讯线程,一个EVENT Handle和一个数据区域
    用一个线程扫描数据库数据,比如一次取20条。
    然后放到一次一条放到各COM通讯线程的数据区域,通过WaitForMultiObjects + Wait For All。当WaitForMultiObjects返回之后再循环下去。