怎么样才能知道我的线程函数到底有没有起作用?

wanwan0923 2010-04-20 11:25:59
要实现pc机之间的通信
void CPC2PCView::OnOpencom()
{
//打开串口操作
hCom=CreateFile(myCom,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);
if(hCom!=INVALID_HANDLE_VALUE)
{
//成功打开串口,执行以下操作
SetupComm(hCom,1500,1500);//设置发送缓冲时间1.5s,接收缓冲时间1.5s
DCB myDCB;
GetCommState(hCom,&myDCB);//获取当前串口参数
myDCB.BaudRate=myBaudRate;
myDCB.fBinary=TRUE;
myDCB.fParity=myfParity;
myDCB.ByteSize=8;
myDCB.Parity=myParity;
myDCB.StopBits=ONESTOPBIT;
SetCommState(hCom,&myDCB);//设置串口通信参数
blnOpened=true;
//创建并立即执行线程函数
DWORD dwParam;
//设置允许的事件类型

/*if((!SetCommMask(hCom,EV_RXCHAR))|EV_TXEMPTY)*/
if(!SetCommMask(hCom,EV_RXCHAR|EV_TXEMPTY))
{
AfxMessageBox("建立事件掩码失败!");
}
hThreadEvent=CreateThread(NULL,//创建事件线程
0,
//指定线程函数名称
(LPTHREAD_START_ROUTINE)(ThreadProcEvent),
&dwParam,
0,//创建线程函数后,立即执行
&dwThreadID);
if(hThreadEvent==INVALID_HANDLE_VALUE)
{
AfxMessageBox("事件线程创建失败!");
}
fEventRun=true;//允许事件函数执行循环体
bytActStatus=10;//操作状态设为接收状态
bytSendStatus=0;//发送状态设为0态
bytRcvStatus=0;//接收状态设为0态
bytResendCount=0;//重发次数清零
uintStxCurNo=0;//当前发送数据序号清零

}
else
{
AfxMessageBox("创建串口失败!");
}

}
/*******************************************************************************/
DWORD CPC2PCView::ThreadProcEvent(LPVOID pParam)
{

DWORD dwEvtMask,dwRes;
bool fStopMsg=false;
Eol.hEvent = CreateEvent(NULL,TRUE, //设置Eol.hEvent成员为无信号状态
FALSE,NULL);
while(fEventRun)
{
WaitCommEvent(hCom,&dwEvtMask, //监视串口事件
&Eol);

dwRes = WaitForSingleObject(Eol.hEvent, //等待信号
1000);
switch(dwRes)
{
case WAIT_OBJECT_0: //成功得到事件监视结果
{
switch(dwEvtMask)
{
case EV_RXCHAR: //接收到数据
{
if(!fStopMsg)
{
fStopMsg = true;
::PostMessage(hWnd,WM_MYMSG, //向主线程发送消息,接收到数据
0,(LPARAM)EV_RXCHAR);
}
break;
}
case EV_TXEMPTY:
{
AfxMessageBox(_T("send buffer is empty"));
break;
}
}
}
case WAIT_TIMEOUT:
{
::PostMessage(hWnd,WM_MYMSG,0,(LPARAM)100);
}
break;
}
return true;

}
}
实验调试可以肯定打开串口函数OnOpencom()已经成功运行,但是不晓得线程函数ThreadProcEvent有没有运行,请高手指教!!!
...全文
226 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
songtao_01 2010-04-21
  • 打赏
  • 举报
回复
加TRACE("%s",YourWords);在你要确定是否运行的语句后面
该语句可以把YourWords打印在调试窗口里
Lourking 2010-04-21
  • 打赏
  • 举报
回复
MessageBeep(int)也可以
Eleven 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wanwan0923 的回复:]
再问一哈,发送和接收必需用两个线程吗?用一个不能实现吗?
[/Quote]
一个也可以
wanwan0923 2010-04-21
  • 打赏
  • 举报
回复
里面是有个MessageBox的,我再试试,谢谢
wanwan0923 2010-04-21
  • 打赏
  • 举报
回复
再问一哈,发送和接收必需用两个线程吗?用一个不能实现吗?
Eleven 2010-04-21
  • 打赏
  • 举报
回复
线程函数有没有运行不是很好测试吗?线程里放个MessageBox不就清楚了或者Debug下是个断点看看
尹成 2010-04-21
  • 打赏
  • 举报
回复



CreateThread函数可以保证线程启动,你想看线程的运行情况

传递一个引用的参数 进入工作线程, 在线程内部改变参数为 特定值

外部测试参数是否变为 特定值 即可
hitwangbw 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wanwan0923 的回复:]
hThreadEvent=CreateThread(NULL,//创建事件线程
0,
//指定线程函数名称
(LPTHREAD_START_ROUTINE)(ThreadProcEvent),
&dwParam,
0,//创建线程函数后,立即执行
&dwThreadID);
这个语句能保证线程启动吗?是不是要用AfxBeginThread函数来启动?
[/Quote]

CreateThread函数可以保证线程启动,你想看线程的运行情况,可以按三楼说的那样做
wanwan0923 2010-04-21
  • 打赏
  • 举报
回复
我刚在线程里面设置了一个断点,运行之后它报告了错误,是不是说明我的线程函数起作用了?
wanwan0923 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 soswaidao 的回复:]
友情帮顶,友情帮顶
[/Quote]
外部测试应该怎么测试?不好意思,初学vc,请多指教
oldmanzhao 2010-04-21
  • 打赏
  • 举报
回复
在线程里设个断点。
wanwan0923 2010-04-21
  • 打赏
  • 举报
回复
hThreadEvent=CreateThread(NULL,//创建事件线程
0,
//指定线程函数名称
(LPTHREAD_START_ROUTINE)(ThreadProcEvent),
&dwParam,
0,//创建线程函数后,立即执行
&dwThreadID);
这个语句能保证线程启动吗?是不是要用AfxBeginThread函数来启动?
wanwan0923 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 songtao_01 的回复:]
加TRACE("%s",YourWords);在你要确定是否运行的语句后面
该语句可以把YourWords打印在调试窗口里
[/Quote]
你好,按照你的提示,我在程序里面添加了那个语句,然后在线程函数里面设置了断点运行之后结果是这样的:

Loaded 'C:\WINDOWS\system32\msimg32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msvcp60.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\wininet.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\crypt32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msasn1.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\comctl32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\MSCTF.dll', no matching symbolic information found.
Loaded 'C:\Program Files\Tencent\QQDoctor\TSVulMon.DAT', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msctfime.ime', no matching symbolic information found.
监听成功


这是不是说明我的监听程序启动了?
wanwan0923 2010-04-21
  • 打赏
  • 举报
回复
看来是真没成功,按道理运行完打开串口OnOpencom以后监听程序就应该有作用的,但是没有反应,囧了,怎么办呢?大家帮忙看看我的监听程序到底有什么问题呢?
DWORD CPC2PCView::ThreadProcEvent(LPVOID pParam)
{

DWORD dwEvtMask,dwRes;
bool fStopMsg=false;
Eol.hEvent = CreateEvent(NULL,TRUE, //设置Eol.hEvent成员为无信号状态
FALSE,NULL);
while(fEventRun)
{
TRACE("%s","监听成功");
WaitCommEvent(hCom,&dwEvtMask, //监视串口事件
&Eol);

dwRes = WaitForSingleObject(Eol.hEvent, //等待信号
1000);
switch(dwRes)
{
case WAIT_OBJECT_0: //成功得到事件监视结果
{
switch(dwEvtMask)
{
case EV_RXCHAR: //接收到数据
{
if(!fStopMsg)
{
fStopMsg = true;
AfxMessageBox(_T("send buffer is empty"));
::PostMessage(hWnd,WM_MYMSG, //向主线程发送消息,接收到数据
0,(LPARAM)EV_RXCHAR);
}
break;
}
case EV_TXEMPTY:
{
AfxMessageBox(_T("send buffer is empty"));
break;
}
}
}
case WAIT_TIMEOUT:
{
::PostMessage(hWnd,WM_MYMSG,0,(LPARAM)100);
}
break;
}
return true;

}
}
处处留心 2010-04-20
  • 打赏
  • 举报
回复
ding 楼上的
田暗星 2010-04-20
  • 打赏
  • 举报
回复
传递一个引用的参数 进入工作线程, 在线程内部改变参数为 特定值

外部测试参数是否变为 特定值 即可
soswaidao 2010-04-20
  • 打赏
  • 举报
回复
友情帮顶,友情帮顶
z8y8x 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sk_sakula 的回复:]

传递一个引用的参数 进入工作线程, 在线程内部改变参数为 特定值
外部测试参数是否变为 特定值 即可
[/Quote]
这种方法可行
sk_sakula 2010-04-20
  • 打赏
  • 举报
回复
传递一个引用的参数 进入工作线程, 在线程内部改变参数为 特定值
外部测试参数是否变为 特定值 即可

15,471

社区成员

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

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