WIN API-程序在选择按钮时被卡住



我正在使用WINAPI创建一个简单的软件,该软件通过USB从连接到计算机的传感器读取数据。在这个软件中,我正在实现一些功能,如读取模式、测试模式等。

我面临的问题是,当我选择按钮进行连续阅读时,我被卡住了,代码如下:

case WM_COMMAND:
switch (wp)
{  
case START_BUTTON:
printf("START_BUTTON"); 
while(SendDlgItemMessage(hWnd,START_BUTTON,BM_GETCHECK ,TRUE,0)== BST_CHECKED)
{
char* var = USB_Read();   //Get data from the sensor
SetWindowText(hLux, var); //Display the data
if (SendDlgItemMessage(hWnd,START_BUTTON,BM_GETCHECK ,TRUE,0)!= BST_CHECKED) //Check if the botton is no longer selected
break;
}
break;
}
break;

我知道问题出在while循环中,当我按下它时,所有程序都会卡住,只有数据显示正确,其他控件都会冻结。

问题是:我如何连续显示数据并同时访问其他控件?

您必须创建一个执行线程,在检查启动时读取usb。因此,我们创建了一个在程序初始化中启动的线程,该线程连续运行,并在每次发现选中按钮时读取usb。

现在,在消息循环中,只需选中或取消选中按钮即可。

DWORD WINAPI ThreadFunction( LPVOID lpParam )
{
(void)lpParam;    //make happy compiler for unused variable
while (TRUE)     //Once created the thread runs always
{
//If checked reads usb for each iteration
if(SendDlgItemMessage(hWnd,START_BUTTON,BM_GETCHECK ,0,0)== BST_CHECKED)
{
char* var = USB_Read();   //Get data from the sensor
SetWindowText(hLux, var); //Display the data
Sleep(1);    //Why this? to don't have a furious CPU usage
}
}
}

.....
//Winmain
DWORD dwThreadId;    //thread ID in case you'll need it
//Create and start the thread
CreateThread( 
NULL,           // default security attributes
0,              // use default stack size  
ThreadFunction, // thread function name
NULL,           // argument to thread function 
0,              // use default creation flags 
&dwThreadId);   // returns the thread identifier
......
case WM_COMMAND:
switch (wp)
{  
case START_BUTTON:
printf("START_BUTTON");
if(SendDlgItemMessage(hWnd,START_BUTTON,BM_GETCHECK ,0,0)== BST_CHECKED)
SendDlgItemMessage(hWnd,START_BUTTON,BM_SETCHECK ,BST_UNCHECKED, 0);
else
SendDlgItemMessage(hWnd,START_BUTTON,BM_SETCHECK ,BST_CHECKED, 0);
break;
}
break;

编辑:我修改了程序以选中/取消选中单选按钮。

请注意使用最小值为1ms的Sleep函数。它用于将控制权交还给操作系统,以平滑CPU的使用。如果在读取usb的函数中有足够的操作系统同步原语,则可以省略它(检查cpu使用情况(。

最新更新