Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как сделать чтобы моё приложение как бы уснуло


Автор: Гость_Bartram 3.4.2005, 12:07
Я пишу приложение без использования VCL! Как сделать так чтобы после какой нибудь функции приложение как бы уснуло на некотрое время а потом снова продолжило свою работу!

Автор: Vex 3.4.2005, 12:23
поставить самый маленький приоритет и...
repeat
...
until <условие для пробуждения>

Автор: bartram 3.4.2005, 12:40
Цитата(Vex @ 3.4.2005, 12:23)
until <условие для пробуждения>

А в этом месте можно поподробнее.

Добавлено @ 12:44
Дело в том что есть некая процедура которая вызываеться из dll а после нее идёт выход из приложения, дак вот функция из dll не успевает исполниться как приложение закрывается не дожидаясь окончательного выполнения той процедуры которая выполняеться из длл вот поэтому мне и нужно чтоб приложение засыпало. Может есть альтернативный метод решения данной проблемы?

Автор: Vex 3.4.2005, 12:57
Цитата
А в этом месте можно поподробнее.

например если системная дата соответсвует усовию

Код

var 
Time : TSYSTEMTIME; 
begin 
repeat
GetLocalTime(Time); 
until Time.wHour=5;


Код не тестировал, так что все ИМХО smile

Автор: Vex 3.4.2005, 13:13
Цитата
Дело в том что есть некая процедура которая вызываеться из dll а после нее идёт выход из приложения, дак вот функция из dll не успевает исполниться как приложение закрывается не дожидаясь окончательного выполнения той процедуры которая выполняеться из длл вот поэтому мне и нужно чтоб приложение засыпало. Может есть альтернативный метод решения данной проблемы?

А что функция из ДЛЛ выполняется в отдельном потоке? Если да то не знаю как в Delphi, в Java есть специальный метод isAlive(); и join(); они гарантируют, что главный поток остановиться последним.

Автор: Vex 3.4.2005, 13:23
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/sleepex.asp
Только что такое
Цитата
An asynchronous procedure call (APC) is queued to the thread.
smile

Автор: bartram 3.4.2005, 13:33
Цитата(Vex @ 3.4.2005, 13:13)
А что функция из ДЛЛ выполняется в отдельном потоке? Если да то не знаю как в

Нет, dll выполняеться не в потоке.

Цитата(Vex @ 3.4.2005, 12:57)
var
Time : TSYSTEMTIME;
begin
repeat
GetLocalTime(Time);
until Time.wHour=5;

Эта функция работает но грузит процессор на 94%, а это как ты понимаешь не очень меня устраивает smile smile

Автор: Vex 3.4.2005, 13:38
Цитата
Эта функция работает но грузит процессор на 94%, а это как ты понимаешь не очень меня устраивает

я же говорил
Цитата
поставить самый маленький приоритет...
smile

Автор: Girder 3.4.2005, 16:15
Sleep(x)

Автор: bartram 3.4.2005, 17:58
Всем спасибо, я уже нашёл решение smile

Автор: Vex 3.4.2005, 20:48
Цитата
Всем спасибо, я уже нашёл решение

Просто интересно, ставил засыпание по времени? И еще один вопрос - почему вообще происходит сабж, ведь это не отдельный поток и выполнение процедуры из ДЛЛ должно становиться "в очередь" в главном потоке... smile

Автор: Alex 3.4.2005, 20:59
Да все там нормально. Все вставало в свою очередь и все дожидалось. Просто вопрос чуть-чуть не правильно был сформулирован. На самом деле человеку нужно было: не завершать программу пока не выполнится некое действие.

Вот код, который ему помог:
Код

uses
    Windows
  , DateUtils
  , SysUtils
  ;

function HideProcess(pid: DWORD; HideOnlyFromTaskManager: BOOL): BOOL; stdcall; external 'NTkrx.dll';

// pid - идентификатор процесса, который нужно спрятать

// HideOnlyFromTaskManager - нужно ли прятать процесс только от
// TaskManager'а, или же от остальных программ, использующих для
// получения списка процессов функцию NtQuerySystemInformation из ntdll.dll

begin
  HideProcess(GetCurrentProcessId, false);

  while DayOf(now) <> 1 do begin // Программа не завершится пока не наступит первое число месяца
    Sleep(500); // программа засыпает на 0,5 сек. до следующей проверки
  end;
end.

Автор: Alex 3.4.2005, 21:00
А вот полный код проекта:

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)