WIN API - программа застревает при нажатии кнопки - PullRequest
0 голосов
/ 11 марта 2020

Я создаю простое программное обеспечение с использованием WINAPI, которое считывает данные с датчика, подключенного к компьютеру через USB. В этом программном обеспечении я реализую некоторые функции, такие как режим чтения, тестовый режим и т. Д. c.

. Проблема, с которой я сталкиваюсь, заключается в том, что я застреваю при выборе кнопки для непрерывного чтения, кода ниже:

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;

Я знаю, что проблема в то время как -l oop, когда я нажимаю на нее, все программы зависают, только данные отображаются правильно, другие элементы управления выглядят как заморожено.

Вопрос: как я могу непрерывно отображать данные и одновременно иметь доступ к другим элементам управления?

1 Ответ

0 голосов
/ 11 марта 2020

Вы должны создать поток выполнения, который читает usb, пока старт проверяется. Таким образом, мы создаем поток, который запускается при инициализации программы, который работает непрерывно и читает usb каждый раз, когда находит основную кнопку.

Теперь в сообщении l oop вы просто проверяете или снимаете флажок с кнопки.

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 с минимальным значением 1 мс. Он используется для возврата управления ОС для сглаживания загрузки процессора. Если в функции, которая читает usb, достаточно примитивов синхронизации ОС, это можно пропустить (проверьте использование процессора).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...