C++ WIN API-选择按钮时程序卡住

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

我正在使用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;
编辑:我修改了程序以选中/取消选中单选按钮


请注意
Sleep
函数的最小值为1ms。它用于将控制权返还给操作系统,以平滑CPU的使用。如果在读取USB的函数中有足够的OS同步原语,它可以省略(检查CPU使用)。< /P>你使用C还是C++?请从标记“如何连续显示数据并同时访问其他控件?”-中删除您不使用的语言,方法是将数据检索从UI线程中卸载。@IInspectable,我不知道如何使用线程,我只是Winapi的初学者。您所做的循环会切断消息循环的执行。停止消息泵时,您不能留在本地计算机内。更改代码删除while并将其替换为
if
。通过这种方式,您可以像以前一样从usb读取每个消息循环,但不要停止它,恢复UI系统的功能。@Frankie_C,我以前试过,事实上,程序停止时卡住了,但是每次我都必须单击“开始”按钮来刷新读取的数据。