Завершение While
У меня вот какая проблемка.
Написал программку, в ней стоит цикл While, причем во время работы
цикла программа как будто виснет и закрывается с принудительным завершение через диспетчер задач.
while (true)
{
DateTimeToString(gg,"hhmm",Now());
if (gg == 1255)
ShowMessage("Пример");
}
Вот. И из-за этого неполучается понормальному закрыть программу.
Неподскажите как лучше мне это сделать, я дамул может не через
Close(); закрывать программу а сразу сам процесс грохать.
______________________________
Вроде проблема ерунда, а программа не пашет
Неподскажите как лучше мне это сделать, я дамул может не через
Лучше всего не использовать такой цикл, т.к. это большая и бесполезная нагрузка процессора. Используйте лучше WaitableTimer
а вообще, на будущее, дайствия выполняемые в цикле, всегда будут вешать программу, пока цикл не завершится, программа не будет откликаться. во избежании этого, но при большой надобности выполнения чего-нить в цикле, используй потоки. благо, тем про их использование было более чем...
Цикл все равно тебе не закрыть так просто. Легче сразу процесс грохуть, но и тут проблема как тебе программа сама себя сможет грохнуть.
________________________________
Не можешь срать не мучай жопу:)
[quote=0nni]
попробуй в цикле ... поставить
Вообще ставь ее во всех длинных циклах...
[/quote]
еще и
еще и
И вы считаете, что это не будет грузить процессор? Бесполезный цикл, который зря занимает процессорное время, да еще и заставляет систему каждую миллисекунду пробуждать и усыплять поток? Application->ProcessMessages(); вещь конечно полезная, но не в этом случае. Она применяется, когда выполняется дейстивтельно затяжное действие. Для ожидания же чего-либо - ИМХО надо юзать потоки и объекты синхронизации.
Ну вообще я согласен с тем что нужно использовать для таких дел вейтебл таймер или отдельный поток. А вот насчёт sleep(1) то это вы ошиблись, вопервых вы сами проверте, используя sleep(1) загрузка процессора будет не 100%, а 10%-20%, поэтому для других приложений останутся ресурсы, а не как предлогаете вы крутить одни и те же ф-и до 100% загрузки проца (допустим в отдельном потоке), а кроме того не будет там той милисекунды, как бы этого не хотелось.....
Ну может погорячился :) не 100%, хотя я о 100 и не говорил ;)
Но согласитесь, 10-20% для программы, которая в данный момент ничего фактически не делает - это очень много. Компиляция проекта в MSVC у меня приводит к загрузке моего слабенького процессора на 20%, так что для программы просто ожидающей - это просто расточительство :)
Не спорю, в некоторых и конкретных случаях этот способ (бесконечный цикл со Sleep) может использоваться, но принимать его как алгоритм ожидания не стоит.
а не как предлогаете вы крутить одни и те же ф-и до 100% загрузки проца (допустим в отдельном потоке)
В том и все дело, что я напротив это и не предлагаю, я против этого. Я предлагаю приостановить поток (исключить его из планируемых), до тех пор, пока не произойдет какое-либо событие. С несколькими потоками же я предлагаю поиграться только в случае если вы хотите обрабатывать в это время пользовательские сообщения ( Application->ProcessMessages() )
Лучше всего не использовать такой цикл, т.к. это большая и бесполезная нагрузка процессора. Используйте лучше WaitableTimer
[/HTML]
Чето у меня неполучается воспользоваться Waitable Timer.
Это же из Win API функций, да?
В справке написано типа Waitable Timer ( параметр, параметр, параметр, параметр)
а что за параментры, я непонимаю английский, и переводчик, не переводит. Что делать?
______________________________
Извените но что имею то имею:(
Читать Рихтера в русском переводе. Или какой-нибудь хороший справочник по WinAPI.
Вот вам еще пример из MSDN'а.
#include <windows.h>
#include <stdio.h>
int main()
{
HANDLE hTimer = NULL;
LARGE_INTEGER liDueTime;
liDueTime.QuadPart=-100000000;
// Create a waitable timer.
hTimer = CreateWaitableTimer(NULL, TRUE, "WaitableTimer");
if (!hTimer)
{
printf("CreateWaitableTimer failed (%d)\n", GetLastError());
return 1;
}
printf("Waiting for 10 seconds...\n");
// Set a timer to wait for 10 seconds.
if (!SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0))
{
printf("SetWaitableTimer failed (%d)\n", GetLastError());
return 2;
}
// Wait for the timer.
if (WaitForSingleObject(hTimer, INFINITE) != WAIT_OBJECT_0)
printf("WaitForSingleObject failed (%d)\n", GetLastError());
else printf("Timer was signaled.\n");
return 0;
}
Чето у меня неполучается воспользоваться Waitable Timer.
Это работает только у тех, кто лично знаком с Биллом Гейтсом.
В справке написано типа Waitable Timer ( параметр, параметр, параметр, параметр)
а что за параментры, я непонимаю английский, и переводчик, не переводит. Что делать?
вариантов много:
-пойти учить английский
-найти нормальный переводчик
-забросить это все нафиг и заняться чем-то, где от тебя будет больше толку.
Третий вариант - предпочтительней.