首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WIN API -选择按钮时程序员卡住

WIN API -选择按钮时程序员卡住
EN

Stack Overflow用户
提问于 2020-03-11 18:02:37
回答 1查看 94关注 0票数 0

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

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

代码语言:javascript
运行
复制
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循环中,当我按下它时,所有的程序都被卡住了,只有数据被正确显示,其他的控件就像冻结了一样。

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

EN

回答 1

Stack Overflow用户

发布于 2020-03-12 03:28:13

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

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

代码语言:javascript
运行
复制
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的函数中有足够的操作系统同步原语,则可以将其省略(检查cpu使用情况)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60633406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档