C++ WIN API-选择按钮时程序卡住
我正在使用WINAPI创建一个简单的软件,通过USB从连接到计算机的传感器读取数据。 在这个软件中,我实现了一些功能,如读取模式、测试模式等 我面临的问题是,当我选择按钮继续阅读时,我被卡住了,代码如下:C++ WIN API-选择按钮时程序卡住,c++,windows,winapi,C++,Windows,Winapi,我正在使用WINAPI创建一个简单的软件,通过USB从连接到计算机的传感器读取数据。 在这个软件中,我实现了一些功能,如读取模式、测试模式等 我面临的问题是,当我选择按钮继续阅读时,我被卡住了,代码如下: case WM_COMMAND: switch (wp) { case START_BUTTON: printf("START_BUTTON"); while(SendDlgItemMessage(hWnd,START_BUTTO
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;
编辑:我修改了程序以选中/取消选中单选按钮
请注意
Sleep
函数的最小值为1ms。它用于将控制权返还给操作系统,以平滑CPU的使用。如果在读取USB的函数中有足够的OS同步原语,它可以省略(检查CPU使用)。< /P>你使用C还是C++?请从标记“如何连续显示数据并同时访问其他控件?”-中删除您不使用的语言,方法是将数据检索从UI线程中卸载。@IInspectable,我不知道如何使用线程,我只是Winapi的初学者。您所做的循环会切断消息循环的执行。停止消息泵时,您不能留在本地计算机内。更改代码删除while并将其替换为if
。通过这种方式,您可以像以前一样从usb读取每个消息循环,但不要停止它,恢复UI系统的功能。@Frankie_C,我以前试过,事实上,程序停止时卡住了,但是每次我都必须单击“开始”按钮来刷新读取的数据。