В программе кучу раз использую Sleep+application.processmessages; либо Code: //p - пауза в секукндах procedure pause(p:byte); var pa1:ttime; begin pa1:=encodetime(0,0,p,0)+time; repeat application.processmessages; sleep(10); until time>=pa1; end; Но и то и то "убивает" визуальные эффекты программы. Тоесть скин начинает работать неправильно, кнопки при наведении мышки не подсвечиваются и тд... Как решить проблему? Возможно ли вызывать паузу в отдельном потоке и ждать, пока поток завершится? Если можно, то как это реализовать? Загуглить не вышло
Code: procedure pause(col:integer); var wtim:ttime; begin wtim:=encodetime(0,0,col,0)+time; repeat application.processmessages; sleep(10); until time>=wtim; end;
Я же написал, что такая пауза "убивает" все визуальные эффекты. Форма не зависает, но эффекты пропадают.
Procedure Wait(interval: integer); var time : integer; begin time = GetTickCount + interval; while GetTickCount < time do application.processmessages; end; как то так, не юзай Sleep , из-за него и идет "зависание" интерфейса, ну или отдельный поток тебе в помощь
Выдает предупреждение Code: [Предупреждение] Unit1.pas(810): Combining signed and unsigned types - widened both operands Эффекты алфаконтроловских шкурок при таких паузах тоже пропадают.
этот код работает хорошо по идее это должно работать и в дельфи Code: VOID GuiWait(int Milliseconds) { HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL); LARGE_INTEGER DueTime; DueTime.QuadPart = -10000 * Milliseconds; SetWaitableTimer(hTimer, &DueTime, 0, NULL, NULL, FALSE); for (;;) { DWORD Status = MsgWaitForMultipleObjectsEx(1, &hTimer, INFINITE, QS_ALLINPUT, MWMO_INPUTAVAILABLE); if (WAIT_OBJECT_0 != Status) { MSG Msg; while (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } } else { break; } } CloseHandle(hTimer); } если изменить для delphi то как то так будет Code: VOID GuiWait(int Milliseconds) { HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL); LARGE_INTEGER DueTime; DueTime.QuadPart = -10000 * Milliseconds; SetWaitableTimer(hTimer, &DueTime, 0, NULL, NULL, FALSE); for (;;) { DWORD Status = MsgWaitForMultipleObjectsEx(1, &hTimer, INFINITE, QS_ALLINPUT, MWMO_INPUTAVAILABLE); if (WAIT_OBJECT_0 != Status) { Application.ProcessMessages; } else { break; } } CloseHandle(hTimer); }
Прошу прощения , давно в делфи не писал, не time = GetTickCount + interval; , а time := GetTickCount + interval;
Как написать процедуру PAUSE(n:integer , чтоб создавала поток, в котором будет выполняться Wait(n) и процедура pause не завершалась, пока не завершится поток?
Берете книгу по WinForms и учите мат.часть: потоки, делегаты, асих.вызовы, события и будет вам счастье