我要完成的工作是,向单片机设备发送多组数据,如果中间有一条接受失败,重复发送3次这条数据。如果3次没有接收到应答则认为通讯失败!我建立了两个线程一个发送线程,一个接收线程。代码如下:
procedure comsendthread.Execute;  //发送线程
begin
  { Place thread code here }
  inherited;
  freeonterminate := True;
  while True do
  begin
    if terminated then break;
    Synchronize(readmem);
    SLEEP(10);
  end;
end;procedure comsendthread.readmem;
var
  i:integer;
begin
  for i:= 13 to 15  do    //数据发送
  begin
  waitforsingleobject(hm_read,INFINITE); 
    if i in [13,14,15] then   
      beginsenddate(i);   //数据发送函数    if i in [16,17,18,19,20,22,28,29] then
      senddate(i);       //数据发送函数
  ReleaseMutex(hm_read);
  mychanger:=comreadThread.Create(30, 05, handle);  //传递参数启动数据接收线程
  end;
    Terminate;
end;
procedure comreadThread.Execute;  //接收数据线程
begin
  inherited;
  freeonterminate := True;
  while True do
  begin
    if terminated then break;
    Synchronize(readmem);
  end;
end;procedure comreadThread.readmem;
var
  head, Count: integer;
begin
  waitforsingleobject(hm_read, INFINITE);
  sleep(500);
    if (Count = Count) then
    begin
      msgstring := '发送成功!';
      ReleaseMutex(hm_read);
      Terminate;
    end
    else
      ReleaseMutex(hm_read);
end;出现的问题是在启动数据接收线程后,数据发送线程应然运行,并没有停止,请问ReleaseMutex(hm_read) 的用法是否正确?

解决方案 »

  1.   

    procedure comsendthread.readmem;
    var
      i:integer;
    begin
      for i:= 13 to 15  do    //数据发送
      begin
      waitforsingleobject(hm_read,INFINITE); 
        if i in [13,14,15] then   
          beginsenddate(i);   //数据发送函数    if i in [16,17,18,19,20,22,28,29] then
          senddate(i);       //数据发送函数
      ReleaseMutex(hm_read);//-----------------这里只创建线程,没启动线程
      mychanger:=comreadThread.Create(30, 05, handle);  //传递参数启动数据接收线程
    //--------------
      end;
        Terminate;
    end;
    上面标记处,你只创建了进程,没启动线程,该句下面用一句“mychanger.resume”启动线程即可
      

  2.   

    在接收线程的Create()内我已经启动了。
    constructor comreadThread.Create(const p_overtime: integer;
      const p_Dataid: byte; const p_frmhandle: thandle);
    begin
      overtime := p_overtime;
      dataid := p_Dataid;
      frmhandle := p_frmhandle;
      inherited Create(False);//启动
    end;
    我是要在发送一条数据后等待回答然后在发下一个。如果发送的没有回答,就认为通讯失败。结束通讯!
      

  3.   

    启动了?启动线程必须要resume,我没看到你的代码里有CREAT后加一句mychanger.resume就OK