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

Пожалуйста дайте пример кода по-проще или ссылку.
...
Рейтинг: 0 / 0
13.10.2014, 12:41
    #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
13.10.2014, 12:45
    #38774990
S0NE0NE
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
Dimitry Sibiryakovтут нет анализа что именно пользователь прервал выполнение программы и к тому meyton советует как-то по другому делать обработки
...
Рейтинг: 0 / 0
13.10.2014, 12:48
    #38774995
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
В двух словах не расскажешь. Рабочий поток всегда лдолжен быть свободен чтобы обрабатывать сообщения от виндовса, поэтому долгоиграющие рассчеты надо выносить в отдельный поток.
_beginthreadex() создает поток, там же внизу пример.

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

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

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

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

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

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

Обычно достаточно воткнуть индикатор выполнения расчета, чтобы пользователь не нервничал что все "повисло". Некоторые avi-шку с прогрессбаром показывают: и считать не надо и юзер видит что прога работает ))
...
Рейтинг: 0 / 0
13.10.2014, 13:30
    #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
13.10.2014, 13:31
    #38775071
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
S0NE0NEтут нет анализа что именно пользователь прервал выполнение программы
А кто ещё способен установить переменную StopNow в true по-твоему?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.10.2014, 13:37
    #38775081
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
S0ME0NEа как же тогда работает команда DoEvents на vb6, после которой можно анализировать глоб. переменные влияющие на выполнение программы...
VB тут при чем? там несколько потоков средствами VB сделаны: один считает, другой с виндовсом общается. С помощью DoEvents первый опрашивает второй.
...
Рейтинг: 0 / 0
13.10.2014, 13:46
    #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
13.10.2014, 14:15
    #38775119
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
Dima T, только ты путаешь термины. Рабочий поток - Worker Thread это как раз тот который занят вычислениями.
...
Рейтинг: 0 / 0
13.10.2014, 14:23
    #38775135
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
maytonDima T, только ты путаешь термины. Рабочий поток - Worker Thread это как раз тот который занят вычислениями.
Исправлюсь
...
Рейтинг: 0 / 0
13.10.2014, 15:28
    #38775252
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
Dima TMasterZivЕсть другой метод -- дискретизация расчётов.
Алгоритм сложного действия разбирается на кусочки, так, чтобы в любой момент можно было бы вызвать какую-то функцию и выполнить следующий кусок работы...
ИМХУ изврат это, код сильно усложняется только ради того чтобы его можно было прервать, а интерфейс все-равно тупит (пользователь думает что прога глючная), т.к. сообщения с запаздыванием обрабатываются. Гораздо проще вынести долгоиграющий код в отдельный поток и навтыкать проверки флага принудительного прерывания, так чтобы гарантированно остановился за 1-2 секунды.
Для языков без многопоточности приходится иногда так делать, но тут не этот случай.

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

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

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

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


Как минимум две переменные не могут не трогаться.
...
Рейтинг: 0 / 0
13.10.2014, 17:39
    #38775451
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
MasterZivКак минимум две переменные не могут не трогаться.
Какие?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.10.2014, 18:10
    #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
14.10.2014, 07:37
    #38775788
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прервать цикл в момент когда пользователь нажал крестик "закрыть окно"?
Dimitry SibiryakovMasterZivКак минимум две переменные не могут не трогаться.
Какие?


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


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