powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
27 сообщений из 27, показаны все 2 страниц
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38774929
S0ME0NE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день.
К примеру простенькая программа, что-то читает в цикле или обрабатывает
и в этот момент пользователю надоело ждать или передумал, короче нажал в правом верхнем углу окна, крестик "закрыть окно".
Дайте пожалуйста примерчик кода, где цикл прерывается пользователем.
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38774950
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вкратце - то вычисления не запускают в стеке WindowProc. Надо переписать приложение по другому.
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38774951
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программа какая? Консольная? Оконная?
Для консольной SetConsoleCtrlHandler()
Для оконной обрабатывай сообщение WM_CLOSE. Только чтобы оно обработалось - твой цикл считания надо в отдельный поток вынести.
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38774970
S0ME0NE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
программка для Win XP оконная, очень простенькая
Мне надо уметь обрабатывать действия пользователя, например закрыть программу в момент выполнения (скажем чтения большущего текстового файла)

Пожалуйста дайте пример кода по-проще или ссылку.
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38774981
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S0ME0NEПожалуйста дайте пример кода по-проще
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
bool StopNow = false;

while(true)
{
   // Что-то делаем
   if (StopNow)
     break;
}


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38774990
S0NE0NE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovтут нет анализа что именно пользователь прервал выполнение программы и к тому meyton советует как-то по другому делать обработки
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38774995
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В двух словах не расскажешь. Рабочий поток всегда лдолжен быть свободен чтобы обрабатывать сообщения от виндовса, поэтому долгоиграющие рассчеты надо выносить в отдельный поток.
_beginthreadex() создает поток, там же внизу пример.

PS Лучше книжку какую-нибудь прочитай про WinAPI для работы с потоками, синхронизацию потоков, про очередь сообщений и оконные сообщения. Подводных камней много при многопоточности, все не расскажешь.
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775004
S0ME0NE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TБлагодарю.
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775006
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S0ME0NEпрограммка для Win XP оконная, очень простенькая
Мне надо уметь обрабатывать действия пользователя, например закрыть программу в момент выполнения (скажем чтения большущего текстового файла)

Пожалуйста дайте пример кода по-проще или ссылку.

Она и так это умеет делать.
Её для этого не нужно отдельно как-то обучать.

Как только закончится долгий расчёт, программа получит соотв. сообщение и, обработав его, закроется.
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775012
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитай Рихтера . Главы 6-9, 26. А лучше целиком.
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775019
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВ двух словах не расскажешь. Рабочий поток всегда лдолжен быть свободен чтобы обрабатывать сообщения от виндовса, поэтому долгоиграющие рассчеты надо выносить в отдельный поток.
_beginthreadex() создает поток, там же внизу пример.

PS Лучше книжку какую-нибудь прочитай про WinAPI для работы с потоками, синхронизацию потоков, про очередь сообщений и оконные сообщения. Подводных камней много при многопоточности, все не расскажешь.

Есть другой метод -- дискретизация расчётов.
Алгоритм сложного действия разбирается на кусочки, так, чтобы в любой момент можно было бы вызвать какую-то функцию и выполнить следующий кусок работы. При этом как правило нужно отдельно сохранять состояние этого алгоритма.
Затем по какому-то событию (в Windows-приложениях всё по событиям) запускается этот процесс, затем устанавливается таймер или
себе самому посылается (PostMessage) какое-то сообщение, и на этом сообщении (или на таймере) обрабатывается следующий кусочек алгоритма. И так по кругу, пока всё не обработается.
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775047
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЕсть другой метод -- дискретизация расчётов.
Алгоритм сложного действия разбирается на кусочки, так, чтобы в любой момент можно было бы вызвать какую-то функцию и выполнить следующий кусок работы...
ИМХУ изврат это, код сильно усложняется только ради того чтобы его можно было прервать, а интерфейс все-равно тупит (пользователь думает что прога глючная), т.к. сообщения с запаздыванием обрабатываются. Гораздо проще вынести долгоиграющий код в отдельный поток и навтыкать проверки флага принудительного прерывания, так чтобы гарантированно остановился за 1-2 секунды.
Для языков без многопоточности приходится иногда так делать, но тут не этот случай.

Обычно достаточно воткнуть индикатор выполнения расчета, чтобы пользователь не нервничал что все "повисло". Некоторые avi-шку с прогрессбаром показывают: и считать не надо и юзер видит что прога работает ))
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775070
S0ME0NE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а как же тогда работает команда DoEvents на vb6, после которой можно анализировать глоб. переменные влияющие на выполнение программы
например событие Form_Close()
Код: vbnet
1.
2.
3.
Sub Form_Close
   глоб_переменная = "всё прекратить"
End



а в процедуре где длительный цикл
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Do while ___
   что-то делаем
   DoEvents
   if глоб_переменная = "всё прекратить"
         exit do
   endif
   ...
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775071
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S0NE0NEтут нет анализа что именно пользователь прервал выполнение программы
А кто ещё способен установить переменную StopNow в true по-твоему?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775081
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S0ME0NEа как же тогда работает команда DoEvents на vb6, после которой можно анализировать глоб. переменные влияющие на выполнение программы...
VB тут при чем? там несколько потоков средствами VB сделаны: один считает, другой с виндовсом общается. С помощью DoEvents первый опрашивает второй.
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775095
S0ME0NE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovS0NE0NEтут нет анализа что именно пользователь прервал выполнение программы
А кто ещё способен установить переменную StopNow в true по-твоему?..

наверное как-то так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndList, hwndStatic, hwndButton1, hwndCopy1, hwndCopy2;
	    LPRECT rcParent; 

    switch(msg) {

        case WM_CLOSE:

                     StopNow = true
...
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775119
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, только ты путаешь термины. Рабочий поток - Worker Thread это как раз тот который занят вычислениями.
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775135
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima T, только ты путаешь термины. Рабочий поток - Worker Thread это как раз тот который занят вычислениями.
Исправлюсь
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775252
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMasterZivЕсть другой метод -- дискретизация расчётов.
Алгоритм сложного действия разбирается на кусочки, так, чтобы в любой момент можно было бы вызвать какую-то функцию и выполнить следующий кусок работы...
ИМХУ изврат это, код сильно усложняется только ради того чтобы его можно было прервать, а интерфейс все-равно тупит (пользователь думает что прога глючная), т.к. сообщения с запаздыванием обрабатываются. Гораздо проще вынести долгоиграющий код в отдельный поток и навтыкать проверки флага принудительного прерывания, так чтобы гарантированно остановился за 1-2 секунды.
Для языков без многопоточности приходится иногда так делать, но тут не этот случай.

Обычно достаточно воткнуть индикатор выполнения расчета, чтобы пользователь не нервничал что все "повисло". Некоторые avi-шку с прогрессбаром показывают: и считать не надо и юзер видит что прога работает ))

Это не изврат, а нормальная техника.
Код не усложняется, а упрощается, потому что при таком подходе он остаётся однопоточным, и тогда не нужно организовывать синхронизацию доступа к переменным. Это по-любому проще, чем многопоточный код.

Про запаздывания -- надо делать части алгоритма маленькими и предсказуемыми по времени.
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775287
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivне нужно организовывать синхронизацию доступа к переменным. Это по-любому
проще, чем многопоточный код.
Если главный поток не трогает переменные, то и доступ к ним синхронизировать не нужно. В
особенности если эти переменные - локальные.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775304
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭто не изврат, а нормальная техника.
Код не усложняется, а упрощается, потому что при таком подходе он остаётся однопоточным, и тогда не нужно организовывать синхронизацию доступа к переменным. Это по-любому проще, чем многопоточный код.

Про запаздывания -- надо делать части алгоритма маленькими и предсказуемыми по времени.
Надо смотреть что у него там за код. Есть класс алгоритмов (рекурсия) которые трудно
выдернуть из контекста исполнения и трудно отдать маркер управления наверх.
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775362
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivне нужно организовывать синхронизацию доступа к переменным. Это по-любому
проще, чем многопоточный код.
Если главный поток не трогает переменные, то и доступ к ним синхронизировать не нужно. В
особенности если эти переменные - локальные.


Как минимум две переменные не могут не трогаться.
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775451
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivКак минимум две переменные не могут не трогаться.
Какие?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775510
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S0ME0NEнаверное как-то так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndList, hwndStatic, hwndButton1, hwndCopy1, hwndCopy2;
	    LPRECT rcParent; 

    switch(msg) {

        case WM_CLOSE:

                     StopNow = true
...


Все верно. Только после надо дождаться пока рабочий поток ее прочитает и завершится. Про потоки я тут пример выложил . Тебе тоже пригодится.
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38775788
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivКак минимум две переменные не могут не трогаться.
Какие?


входные данные потока и признак необходимости завершиться .
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38776048
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivвходные данные потока и признак необходимости завершиться .
Но синхронизация при обращении к ним не нужна, поскольку первое заполняется ещё до старта
потока, а второе используется атомарно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
    #38776147
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivвходные данные потока и признак необходимости завершиться .
Но синхронизация при обращении к ним не нужна, поскольку первое заполняется ещё до старта
потока, а второе используется атомарно.


Первое -- не понятно без кода.
Второе -- я вообще не знаю, что такое. Так что синхронизация нужна.
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]