Member 12208944 Ответов: 3

Проблемы с таймером в mfc VC++ 6.0


Я добавляю код в уже проверенный код, который подключен к инструменту через ethernet.я добавляю еще один инструмент API в том же коде.я хочу генерировать сигнал для каждых 50 мс, чтобы достичь того времени, которое я использую для цикла генерации сигнала для различной частоты, используемой для сна в течение 50 мс. Когда я запускаю код, все приложение зависает до завершения цикла for. Я хочу генерировать частотный сигнал для каждых 50 мс без подвешивания приложения. У меня есть две идеи: одна-таймер, а другая-нить.

Что я уже пробовал:

Я устал с таймером, но не работал. Любые примеры генерации потоков на основе диалогов присылайте мне.

3 Ответов

Рейтинг:
7

Jochen Arndt

Никогда не использовать Sleep() в основном потоке (GUI).

Как уже упоминалось, существует множество ресурсов о потоках.
Вот такой пример Использование Рабочих Потоков[^].

На основе этой статьи вы должны создать рабочий поток и событие для остановки потока. Тогда функция рабочего потока может выглядеть следующим образом:

/*static*/ UINT CMyThreadClass::ThreadFunc(LPVOID p)
{
    CMyThreadClass * self = (CMyThreadClass *)p;
    bool bStop = false;
    while (!bStop)
    {
        switch (::WaitForSingleObject(self->m_StopEventHandle, 50))
        {
        case WAIT_OBJECT_0 :
            bStop = true;
            break;
        case WAIT_TIMEOUT :
            // Generate signal here
            break;
        }
    }
    return 0;
}
Хотя это обеспечивает лучшую точность синхронизации, чем обычный таймер, он все равно не будет абсолютно точным. Если вы используете, например, блокировку вызовов сокетов в рабочем потоке, возможно, потребуется соответствующим образом скорректировать значение тайм-аута, измерив время выполнения.


Member 12208944

То, что я понял, я и пишу:
Мне нажать одну кнопку, кнопку функция будет иметь функцию afxbeginthread функции для вызова функции threadfunc войти в цикл while, то, что происходит, откуда m_stopeventhandle придет , если он является членом кнопка функций waitforsingleobject ждать 50 мс после отключения генерации сигнала сразу после перерыва конец цикла while, я хочу, чтобы каждый 50мс частота генерации сигнала без зависания другой функции таймеры потоков одного приложения, если я ошибаюсь в понимании, может у объясните мне

Jochen Arndt

Вам нужно прочитать о потоках и понять.

В Windows вы обычно создаете класс для своего потока. Он содержит по крайней мере (статическую) функцию потока, функцию запуска, которая создает поток и запускает выполнение, и функцию остановки (которая также вызывается из деструктора).

Функция stop установит событие, чтобы сообщить потоку, что он должен покинуть свой цикл и вернуться. Он должен быть вызван при завершении вашего приложения и может быть вызван всякий раз, когда вы хотите остановить поток.

Функции WaitFor... вернутся либо при наступлении события, либо по истечении тайм-аута.

Member 12208944

Спасибо, это работает ....

Рейтинг:
1

Richard MacCutchan

Google найдет вам образцы, или вы можете посмотреть на Многопоточность с помощью C++ и MFC[^]


Рейтинг:
1

CPallini

Взгляните на новичка Серия потоков и процессов.

Пожалуйста, обратите внимание 50 ms это относительно короткое время для Windows OS Более того, чтобы ваше приложение оставалось отзывчивым, "активная" (то есть не спящая) часть вашего кода должна составлять небольшую часть 50 ms (то есть ваша нить должна спать большую часть времени).