基于MFC的多线程程序,要对三个USB设备(D1,D2,D3)进行读写。主窗口(CMainDlg)有3个按钮B1,B2,B3,分别操作设备D1,D2,D3,操作进度要在进度条P1,P2,P3上显示。按每个按钮,会分别启动对应的设备读写线程,并更新进度条。现在这样做的:
short g_curPos[3]; //全局变量,表示当前进度// MainDlg.cpp
void CMainDlg::OnBnClickedB1()
{
short DeviceID = 0;
AfxBeginThread( ThreadProc, &DeviceID, THREAD_PRIORITY_LOWEST );
}void CMainDlg::OnBnClickedB2()
{
short DeviceID = 1;
AfxBeginThread( ThreadProc, &DeviceID, THREAD_PRIORITY_LOWEST );
}void CMainDlg::OnBnClickedB3()
{
short DeviceID = 2;
AfxBeginThread( ThreadProc, &DeviceID, THREAD_PRIORITY_LOWEST );
}LRESULT CMainDlg::OnUpdateProg(WPARAM wState, LPARAM lPtr )
{
short DeviceID = *(short *)lPtr;
switch( wState )
{
case STATE_START:
Progress[Device].SetRange( 0, 100 );
Progress[Device].SetPos( g_curPos);
break;
case STATE_UPDATE:
Progress[Device].SetPos( g_curPos );
break;
case STATE_END:
break;
default:
break;
}
}// Thread.cpp
UINT ThreadProc( LPVOID lpParam )
{
int i;
short DeviceID = *(short *)lpParam;
for( i = 0; i < 100; i++ )
{
if( i == 0 )
{
g_curPos[DeviceID] = i;
::PostMessage( hMainWndHandle, WM_USER_UPDATE_PROGRESS, STATE_START, (LPARAM)&Device ); // 发送进度条初始化的消息
}
else
{
g_curPos[DeviceID] = i;
::PostMessage( hMainWndHandle, WM_USER_UPDATE_PROGRESS, STATE_UPDATE, (LPARAM)&Device ); // 发送进度条更新的消息
} readDevice[DeviceID]; // 读数据
} ::PostMessage( hMainWndHandle, WM_USER_UPDATE_PROGRESS, STATE_END, (LPARAM)&Device ); // 发送结束消息
AfxEndThread( 0, TRUE );
}现在的问题:
按按钮进度条可以正常更新,但是有时按B2,B3,更新也会更新到B1,不知道为什么?单步的时候发现有时按B2,B3时,ThreadProc获得的参数是0。
short g_curPos[3]; //全局变量,表示当前进度// MainDlg.cpp
void CMainDlg::OnBnClickedB1()
{
short DeviceID = 0;
AfxBeginThread( ThreadProc, &DeviceID, THREAD_PRIORITY_LOWEST );
}void CMainDlg::OnBnClickedB2()
{
short DeviceID = 1;
AfxBeginThread( ThreadProc, &DeviceID, THREAD_PRIORITY_LOWEST );
}void CMainDlg::OnBnClickedB3()
{
short DeviceID = 2;
AfxBeginThread( ThreadProc, &DeviceID, THREAD_PRIORITY_LOWEST );
}LRESULT CMainDlg::OnUpdateProg(WPARAM wState, LPARAM lPtr )
{
short DeviceID = *(short *)lPtr;
switch( wState )
{
case STATE_START:
Progress[Device].SetRange( 0, 100 );
Progress[Device].SetPos( g_curPos);
break;
case STATE_UPDATE:
Progress[Device].SetPos( g_curPos );
break;
case STATE_END:
break;
default:
break;
}
}// Thread.cpp
UINT ThreadProc( LPVOID lpParam )
{
int i;
short DeviceID = *(short *)lpParam;
for( i = 0; i < 100; i++ )
{
if( i == 0 )
{
g_curPos[DeviceID] = i;
::PostMessage( hMainWndHandle, WM_USER_UPDATE_PROGRESS, STATE_START, (LPARAM)&Device ); // 发送进度条初始化的消息
}
else
{
g_curPos[DeviceID] = i;
::PostMessage( hMainWndHandle, WM_USER_UPDATE_PROGRESS, STATE_UPDATE, (LPARAM)&Device ); // 发送进度条更新的消息
} readDevice[DeviceID]; // 读数据
} ::PostMessage( hMainWndHandle, WM_USER_UPDATE_PROGRESS, STATE_END, (LPARAM)&Device ); // 发送结束消息
AfxEndThread( 0, TRUE );
}现在的问题:
按按钮进度条可以正常更新,但是有时按B2,B3,更新也会更新到B1,不知道为什么?单步的时候发现有时按B2,B3时,ThreadProc获得的参数是0。
解决方案 »
- 循环使用1.tga,2.tga,3.tga,4.tga........的算法
- 请问*.dsw不能打开的问题
- 关于opengl 的图形切割的问题,分数不够再加!
- 求救:怎么解决下面的错误 fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h>
- 如何用Visual C++ 6.0访问Access2000的文件?(不使用odbc)急!高手指点
- 关于多线程的问题
- 怎么知道外置mic还是内置?
- 传参问题
- 如何查询最新数据
- vc++下(MFC)如何获取扫码机传过来的条码
- 在主线程里WaitForSingleObject为什么界面会卡住?
- 关于getpeername
这样有可能线程访问DeviceID的地址时,OnBnClickedB函数已经返回,DeviceID已经无效。DeviceID直接传值吧。
AfxBeginThread( ThreadProc, DeviceID, THREAD_PRIORITY_LOWEST );short DeviceID = *(short *)lpParam;改为short DeviceID = (short)lpParam;
要把DeviceID 作为全局变量.
(LPARAM)&Device你这些地方的传的地址都是局部变量的地址啊,超出作用域后这个地址就已经是不可控的了
直接传值吧