我要完成的工作是,向单片机设备发送多组数据,如果中间有一条接受失败,重复发送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) 的用法是否正确?
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) 的用法是否正确?
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”启动线程即可
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;
我是要在发送一条数据后等待回答然后在发下一个。如果发送的没有回答,就认为通讯失败。结束通讯!