Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 10.06.2013
Сообщений: 153

2 цикла одновременно

06.03.2021, 14:14. Показов 4582. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
while (GetMessage(&msg, nullptr, 0, 0))
{   
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }               
}
 
while(boolrun)
{
      Main();
      Sleep(100);
}
Один цикл обработки сообщений, второй цикл с моим кодом. Как мне это реализовать?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.03.2021, 14:14
Ответы с готовыми решениями:

Запустить одновременно 3 цикла
Здравствуйте уважаемые форумчане. Как мне сделать так, чтобы запустились одновременно 3 цикла, а не поочереди? Конечно возможно это сделать...

С любого из операторов цикла вычислить y. Оператор if в теле цикла не использовать
С помощью любого из операторов цикла вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. Шаг...

Применение цикла if для определения простых чисел. If внутри цикла for
Доброго времени суток, подскажите пожалуйста, в чем тут дело. С кодом все хорошо, все работает, просто я пытаюсь докопаться до сути и...

25
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
06.03.2021, 14:46
Rybik001, запустите таймер с нужным периодом и в функции окна обрабатывайте сообщение WM_TIMER

Добавлено через 3 минуты
А можно вообще задать функцию таймера, которая будет вызываться, минуя функцию окна
Установка таймера делается при помощи SetTimer()
1
1 / 1 / 0
Регистрация: 10.06.2013
Сообщений: 153
06.03.2021, 15:19  [ТС]
C++
1
SetTimer(hWnd, 100, 100, NULL);
сделал запуск таймера по нажатию на кнопку.

C++
1
2
3
case WM_TIMER:
        Main();
        break;
В функции обработчика добавил.

Все работает.

Цитата Сообщение от liv Посмотреть сообщение
А можно вообще задать функцию таймера, которая будет вызываться, минуя функцию окна
Установка таймера делается при помощи SetTimer()
А как сделать минуя функцию окна? там же надо задать hwnd окна?

Добавлено через 14 минут
Проблема в том что все элементы окна начинают тормозить когда я вызываю функцию с помощью SetTimer.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
06.03.2021, 15:27
Rybik001, а Вы разве его не знаете? Это handle вашего окна.
Таймер связывается с очередью окна. Если задана функция таймера примерно такого типа:
C++
1
VOID CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime)
и задана при создании таймера, то сообщения WM_TIMER отправляются не в общую очередь, а вызывается эта функция.

Добавлено через 3 минуты
Цитата Сообщение от Rybik001 Посмотреть сообщение
все элементы окна начинают тормозить
А по таймеру надо делать только что-то небольшое. Если там большая отработка и частая, то естественно будут тормоза. Значит, надо оптимизировать работу, разложить по времени, может, что-то отрабатывать в других сообщениях, например, в программных (посылать себе сообщение).
0
1 / 1 / 0
Регистрация: 10.06.2013
Сообщений: 153
06.03.2021, 15:36  [ТС]
Цитата Сообщение от liv Посмотреть сообщение
А по таймеру надо делать только что-то небольшое. Если там большая отработка и частая, то естественно будут тормоза. Значит, надо оптимизировать работу, разложить по времени, может, что-то отрабатывать в других сообщениях, например, в программных (посылать себе сообщение).
У меня как раз большой объем кода, который будет в цикле while. Нужно чтобы помимо этого работал обработчик окна без тормозов.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
06.03.2021, 16:55
Цитата Сообщение от Rybik001 Посмотреть сообщение
У меня как раз большой объем кода
Чудес не бывает... Думайте, как оптимизировать работу
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
06.03.2021, 18:24
Цитата Сообщение от Rybik001 Посмотреть сообщение
Проблема в том что все элементы окна начинают тормозить когда я вызываю функцию с помощью SetTimer.
Запускай в отдельном потоке
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
auto thread = std::thread([&]()
{
    while(boolrun)
    {
        Main();
        Sleep(100);
    }
});
 
while (GetMessage(&msg, nullptr, 0, 0))
{   
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }               
}
 
boolrun = false;
thread.join();
0
1 / 1 / 0
Регистрация: 10.06.2013
Сообщений: 153
06.03.2021, 18:32  [ТС]
Сделал через
C++
1
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Main, NULL, 0, NULL);
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
06.03.2021, 18:35
Цитата Сообщение от Rybik001 Посмотреть сообщение
Сделал через
Сделай тогда уж через _beginthreadex, как положено
И не забудь дождаться завершения этого потока перед выходом
0
1 / 1 / 0
Регистрация: 10.06.2013
Сообщений: 153
06.03.2021, 19:04  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Сделай тогда уж через _beginthreadex, как положено
И не забудь дождаться завершения этого потока перед выходом
_beginthreadex(NULL, 0, (_beginthreadex_proc_type)Main, NULL, 0, NULL);

Добавлено через 2 минуты
А как дождаться? Я просто закрываю.
C++
1
ExitThread(0);
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
06.03.2021, 19:06
Цитата Сообщение от Rybik001 Посмотреть сообщение
А как дождаться? Я просто закрываю.
Это неправильно. Надо
C++
1
2
boolrun = false;
::WaitForSingleObject(hThread, INFINITE);
Там же по ссылке есть пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// crt_begthrdex.cpp
// compile with: /MT
#include <windows.h>
#include <stdio.h>
#include <process.h>
 
unsigned Counter;
unsigned __stdcall SecondThreadFunc( void* pArguments )
{
    printf( "In second thread...\n" );
 
    while ( Counter < 1000000 )
        Counter++;
 
    _endthreadex( 0 );
    return 0;
}
 
int main()
{
    HANDLE hThread;
    unsigned threadID;
 
    printf( "Creating second thread...\n" );
 
    // Create the second thread.
    hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID );
 
    // Wait until second thread terminates. If you comment out the line
    // below, Counter will not be correct because the thread has not
    // terminated, and Counter most likely has not been incremented to
    // 1000000 yet.
    WaitForSingleObject( hThread, INFINITE );
    printf( "Counter should be 1000000; it is-> %d\n", Counter );
    // Destroy the thread object.
    CloseHandle( hThread );
}
0
1 / 1 / 0
Регистрация: 10.06.2013
Сообщений: 153
06.03.2021, 19:37  [ТС]
C++
1
2
HANDLE hThread;
hThread = (HANDLE)_beginthreadex(NULL, 0, (_beginthreadex_proc_type)Main, NULL, 0, NULL);
C++
1
2
3
4
5
6
    case WM_DESTROY:
        boolrun = FALSE;
        WaitForSingleObject(hThread, INFINITE);
        CloseHandle(hThread);
                PostQuitMessage(0);
             break;
C++
1
2
3
4
5
6
7
8
VOID __stdcall Main(){
    while (SecontThread)
    {
        Sleep(100);
    }
    MessageBox(NULL, "End Thread", NULL, MB_OK);
    _endthreadex(0);
}
Вот так верно?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
06.03.2021, 19:43
Цитата Сообщение от Rybik001 Посмотреть сообщение
Вот так верно?
Где ты этот поток запускаешь?
Цитата Сообщение от Rybik001 Посмотреть сообщение
hThread = (HANDLE)_beginthreadex(NULL, 0, (_beginthreadex_proc_type)Main, NULL, 0, NULL);
Зачем ты преобразовываешь Main? Убери это и объяви Main так, как требует _beginthreadex
Цитата Сообщение от Rybik001 Посмотреть сообщение
boolrun = FALSE;
        WaitForSingleObject(hThread, INFINITE);
Цитата Сообщение от Rybik001 Посмотреть сообщение
while (SecontThread)
    {
        Sleep(100);
    }
Почему здесь разные переменные, как ты собрался завершать этот цикл?

Добавлено через 1 минуту
Цитата Сообщение от Rybik001 Посмотреть сообщение
MessageBox(NULL, "End Thread", NULL, MB_OK);
    _endthreadex(0);
}
Убери _endthreadex. Не знаю, за каким хреном майкрософт сюда его вкрячил в своём же примере.
0
1 / 1 / 0
Регистрация: 10.06.2013
Сообщений: 153
06.03.2021, 19:47  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Почему здесь разные переменные, как ты собрался завершать этот цикл?
Тут ошибся, у меня там 2 переменные. Одна для while, вторая для if.

C++
1
2
3
4
5
6
7
8
9
10
11
12
VOID __stdcall Main(){
    while (SecontThread)
    {
        if (boolrun)
        {
                     ...
                 }
        Sleep(100);
    }
    MessageBox(NULL, "End Thread", NULL, MB_OK);
    _endthreadex(0);
}
Добавлено через 2 минуты
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Зачем ты преобразовываешь Main? Убери это и объяви Main так, как требует _beginthreadex
C++
1
hThread = (HANDLE)_beginthreadex(NULL, 0, &Main, NULL, 0, NULL);
Вот так выдает ошибку: аргумент типа "void(__stdcall*())" несовместим с параметром типа _beginthreadex_proc_type.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
06.03.2021, 19:48
Цитата Сообщение от Rybik001 Посмотреть сообщение
Вот так выдает ошибку: аргумент типа "void(__stdcall*())" несовместим с параметром типа _beginthreadex_proc_type.
Правильно выдаёт
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
объяви Main так, как требует _beginthreadex
0
1 / 1 / 0
Регистрация: 10.06.2013
Сообщений: 153
06.03.2021, 19:48  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Где ты этот поток запускаешь?

поток запуская в

C++
1
2
3
4
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
...
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
06.03.2021, 19:51
uintptr_t _beginthreadex( // NATIVE CODE
void *security,
unsigned stack_size,
unsigned ( __stdcall *start_address )( void * ),
void *arglist,
unsigned initflag,
unsigned *thrdaddr
);
++++

Добавлено через 49 секунд
Цитата Сообщение от Rybik001 Посмотреть сообщение
поток запуская в
Покажи всю функцию, а не только имя
1
1 / 1 / 0
Регистрация: 10.06.2013
Сообщений: 153
06.03.2021, 19:52  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
объяви Main так, как требует _beginthreadex
C++
1
_beginthreadex_proc_type __stdcall Main();
так что ли?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
06.03.2021, 19:55
Цитата Сообщение от Rybik001 Посмотреть сообщение
так что ли?
C++
1
unsigned __stdcall Main(void *){
1
1 / 1 / 0
Регистрация: 10.06.2013
Сообщений: 153
06.03.2021, 20:09  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
unsigned __stdcall Main(void *){
Почему то я подумал что сам могу определить тип функции

Добавлено через 8 минут
C++
1
HANDLE hThread;
C++
1
2
3
4
5
6
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
...
hThread = (HANDLE)_beginthreadex(NULL, 0, &Main, NULL, 0, NULL);
...
}
C++
1
2
3
4
5
6
7
case WM_DESTROY:
        boolrun = FALSE;
        SecontThread = FALSE;
        WaitForSingleObject(hThread, INFINITE);
        CloseHandle(hThread);
                PostQuitMessage(0);
        break;
C++
1
2
3
4
5
6
7
8
9
10
11
12
unsigned __stdcall Main(void*){
    while (SecontThread)
    {
        if (boolrun)
        {
                    ...
                }
        Sleep(100);
    }
    MessageBox(NULL, "End Thread", NULL, MB_OK);
    return 0;
}
Вот так получилось
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.03.2021, 20:09
Помогаю со студенческими работами здесь

Используя одну переменную цикла укажите возможные способы объявления заголовка счетного цикла.
Используя одну переменную цикла укажите возможные способы объявления заголовка счетного цикла.

вывод на экран чисел 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12, с использованием одного цикла и что бы все printf были только в теле цикла
вывод на экран чисел 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12, с использованием одного цикла и что бы все printf были только в теле...

Нахождение отрицательного цикла в графе и вывод цикла
Вот программа по нахождению отрицательного цикла в графе и вывод цикла void Floyd(int GR, int parents , int V) { int checking; int...

Выполните, пожалуйста, задание, при этом вместо оператора цикла while используйте оператора цикла do_while
Используя оператор цикла while, напишите программу для вычисления ниже следующей суммы. // fkdj.cpp: определяет точку входа...

Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры.
Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. Шаг изменения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru