2个线程如何同时运行(都有死循环)

kyhong 2005-04-29 09:35:06
我需要从PLC(相当于网络吧)读到的数据,从串口发送出去,当然是在得到串口需要数据传输的信号,但是我现在使用了2个独立线程,在线程中又都使用了while(1) 的死循环,可是在对话框的InintialDialog()中又同时启动了这2个线程,得到的结果就是只停在一个线程的死循环里,哎,不知道该怎么办呢???愁的我啊……
现在把这2个线程里的死循环去掉,又在OnTimer()中启动这2个线程才得以解决,但是我知道这样做是不对的,谁能帮助想个办法么,我不是很懂这些东西,大家多帮个忙吧,先行谢过了
...全文
405 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
BigFanOfCpp 2005-04-30
  • 打赏
  • 举报
回复
可以用事件对象(Event)。

一个线程处理完后,另一个线程处理,中间采用事件对象处理线程同步。
ddgfei 2005-04-30
  • 打赏
  • 举报
回复
本人觉得你用事件响应机制可能更好一点。
你的代码让我很难知道你究竟想达到什么目的。
你是不是想循环读取数据,然后在另外的程序中处理?
frank_yufu 2005-04-30
  • 打赏
  • 举报
回复
能实现要求就可以了
如果PLC和串口的通信是有一定顺序的,可以用消息机制。
kyhong 2005-04-30
  • 打赏
  • 举报
回复
我要是会的话就不问了,嘿嘿,哎,要是有人帮我编个框框就好了,哎,我是太笨了
oyljerry 2005-04-30
  • 打赏
  • 举报
回复
用内核事件或别的方式来同步线程
kyhong 2005-04-30
  • 打赏
  • 举报
回复
to不懂规矩:是的,是一直在读,然后再ReadData();里面处理这些,解析格式什么的阿,而且发送的数据是从plc读过来的
kyhong 2005-04-29
  • 打赏
  • 举报
回复
是,是这个:(一直等待Event)

Event = WaitForMultipleObjects(3, port->m_hEventArray, FALSE, INFINITE);
//Event = 1;
switch (Event)
{
case 0:
{
// Shutdown event. This is event zero so it will be
// the higest priority and be serviced first.
CloseHandle(port->m_hComm);
port->m_hComm=NULL;
port->m_bThreadAlive = FALSE;

// Kill this thread. break is not needed, but makes me feel better.
AfxEndThread(100);

break;
}
case 1: // read event
{
GetCommMask(port->m_hComm, &CommEvent);
if (CommEvent & EV_RXCHAR)
// Receive character event from port.
ReadData(port);
……
}
FireInRain 2005-04-29
  • 打赏
  • 举报
回复
没有用信标之类的东西么?会不会是其中一个thread被永久的锁住了?
Practise_Think 2005-04-29
  • 打赏
  • 举报
回复
这样也可以,不过你得保证串口收到的数据段是完整的,也就是说一次ReadFile得到的数据未必就是一个完整的数据段
kyhong 2005-04-29
  • 打赏
  • 举报
回复
与PLC的:
void readplc()
{
……
while (1)
{
//test
//AfxMessageBox("PLC通讯!");
//test
connectPLC->ReadRegister(0,(unsigned short)(200),6);

if (connectPLC->BitBuffer[0]==1) //check =0 error
{
//处理
}

else connectPLC->err_num++;

if (connectPLC->err_num>=50)
{
// err_num=0;
connectPLC->DisconnectPLC();
if (connectPLC->ConnectPLC(connectPLC->ip_adrs2)!=0)
{
connectPLC->DisconnectPLC();
if (connectPLC->ConnectPLC(connectPLC->ip_adrs1)==0) connectPLC->err_num=0;
}
else connectPLC->err_num=0;
}
Sleep(200);//
}
return 1;
}

与串口的:(看看,是不是觉得没有必要进行死循环阿)

void readData()
{
……
while(1)
{
int i;
i=0;
RLen=port->ReadComm(port->m_szWriteBuffer,100);

AfxMessageBox("串口通讯!");
while(RLen>i)
{
//做要做的事
}
}
……
}
jerry 2005-04-29
  • 打赏
  • 举报
回复
while(1) 中间有没有休息的地方?
代码弄出来瞧瞧

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧