Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> заставить прогу всё время работать, висеть в памяти и работать 
:(
    Опции темы
Alexeis
Дата 27.10.2005, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата
while true

лучше не while true , а while not terminated
тогда будет коректное завершение


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Romikgy
Дата 27.10.2005, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Для общения с VCL необходимо юзать Synchronize (если не ошибся в написании smile ) , ну и почитать нуно про потоки , раз уж хош через них делать.
Зы у тя есть
Цитата(h2o @ 27.10.2005, 09:07)
wait(10000);

и это очень похоже на таймер smile только загрузка проца в твоем случае будет близка к максимальной , при использовании таймера будет минимальной, ИМХО .


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 27.10.2005, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата
а чё он так будет в памяти висеть... и постоянно через интервал проверять и проверять?

через каждые 10 секунд.
лучше wait(10000) заменить на sleep(10000)

Это сообщение отредактировал(а) alexeis1 - 27.10.2005, 09:38


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Romikgy
Дата 27.10.2005, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата(alexeis1 @ 27.10.2005, 09:31)
лучше не while true , а while not terminated
тогда будет коректное завершение

ИМХО разница будет не велика, при суспенде или терминейте поток будет тормозится/убиватся в любом случае.


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
h2o
Дата 27.10.2005, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: нет
Всего: 1



Romikgy чё то не работает! загрузка проца моей прогой 0-1%. видимо поток не висит в памяти а 1 раз выполнился!

я так сделал, добавил ещё while not terminated пробую...

alexeis1 while not terminated - указал. а как теперь терминате проток сделать. если я его из главной формы вызываю. и в главной форме делаю close; то и поток будет terminated автоматом?
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Alexeis
Дата 27.10.2005, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата
ИМХО разница будет не велика, при суспенде или терминейте поток будет тормозится/убиватся в любом случае.

вызов terminate приводит только к установке флага terminated
в true а не к убиванию потока smile


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
h2o
Дата 27.10.2005, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: нет
Всего: 1



Код

procedure ArcThread.Execute;
var Msg: TMsg; NowDate, ArcDate:TDateTime;
begin
  SetName;
  while not terminated do
  begin
   NowDate:=StrToDate(Date);
   ArcDate:=SettingsMenu.g1DateArc.DateTime;
   if NowDate>=ArcDate then  SettingsMenu.ProcArchive1CBase;
   sleep(1000);
  end;
end;


вот так работает!!!

вот тока если форм клозе сделать, выдается ошибка acsess violation и адреса 00000

Добавлено @ 09:50
как это победить?

да и ещё, у меня стоит условие if NowDate>=ArcDate then , а работает тока если NowDate>ArcDate, почему-то при= не работает!!!
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Alexeis
Дата 27.10.2005, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата
если я его из главной формы вызываю. и в главной форме делаю close; то и поток будет terminated автоматом?

нет нужно в onclose формы вызвать mythead.terminate;
waitforsingleobject(mythead, infinity);

ошибся smile
mythead.waitfor;

Это сообщение отредактировал(а) alexeis1 - 27.10.2005, 09:55


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Romikgy
Дата 27.10.2005, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата(h2o @ 27.10.2005, 09:22)
а чё он так будет в памяти висеть... и постоянно через интервал проверять и проверять?

Аха smile
Добавлено @ 10:00
Я могу и ошибатся , но mythead это класс потока, какое он имеет отношение к событиям??? smile

Цитата(alexeis1 @ 27.10.2005, 09:51)
waitforsingleobject(mythead, infinity);

Я не совсем понял smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 27.10.2005, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



как раз в waitforsingleobject(mythead, infinity); я и ошибся
верно mythead.waitfor
приложение подождет пока поток не завершится затем
вызовет
mythead.free;
и затем завершит работу

поправлено

Цитата
mythead это класс потока, какое он имеет отношение к событиям???

никакого события нет

код VCl


Код

property Terminated: Boolean read FTerminated;

procedure TThread.DoTerminate;
begin
  if Assigned(FOnTerminate) then Synchronize(CallOnTerminate);
end;

procedure TThread.Terminate;
begin
  FTerminated := True;
end;

procedure TThread.CallOnTerminate;
begin
  if Assigned(FOnTerminate) then FOnTerminate(Self);
end;


Это сообщение отредактировал(а) alexeis1 - 27.10.2005, 10:18


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RideX
Дата 27.10.2005, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 2
Всего: 7



h2o, думаю ты это хотел?
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  Year : WORD = 2005;
  Month: WORD = 10;
  Day  : WORD = 27;

var
  hThread : THandle;
  ThreadID: DWORD;

  stm: TSYSTEMTIME;
  IsDone: Boolean = False;


procedure MyProc;
begin
  if IsDone = True then
    Exit;
  MessageBox(0, 'Моя функция', 'MyProc', MB_ICONINFORMATION);
  IsDone := True;
end;

procedure ThreadProc;stdcall;
begin
  while True do
    asm
      push 1
      call Sleep

      push offset stm
      call GetLocalTime

      xor eax,eax
      mov ax,stm.wYear
      cmp ax,Year
      jb @exit

      mov ax,stm.wMonth
      cmp ax,Month
      jb @exit

      mov ax,stm.wDay
      cmp ax,Day
      jb @exit

      call MyProc;
    @exit:
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  hThread := CreateThread(nil, 0, @ThreadProc, nil, 0, ThreadID);
  if hThread = 0 then begin
    MessageBox(Handle, PChar(SysErrorMessage(GetLastError)), 'Error', MB_ICONERROR);
    Exit;
  end;
  SetThreadPriority(hThread, THREAD_PRIORITY_LOWEST);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  TerminateThread(hThread, DWORD(-1));
end;

end.


PM   Вверх
h2o
Дата 27.10.2005, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: нет
Всего: 1



RideX Ну нифига ты замутил! с асмом ваше не понятно.
procedure ThreadProc;stdcall; - чё тутхоть делается то?

--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Guest
Дата 27.10.2005, 14:20 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











RideX, разобрался! спасибо. всё понятно кроме:
Код

procedure ThreadProc;stdcall;
begin
  while True do
    asm
      push 1 //куда-то заталкиваем 1, куда?
      call Sleep //спим, скока? стока скока затолкали перед этим? типа 1 секунду???

      push offset stm //???
      call GetLocalTime //вызываем получить время
...


а аналога на делфи нет? а то прото все операции со временем и условия, сравнения мне удобнее делать на делфи!!! я в асме мало что понимаю, а у меня стоко операций сравнения времени, которые берутся из TDateTimePiker'ов, едитов и т.д.

на делфи то есть аналогичная функция или средствами делфи этого не сделать?
  Вверх
Гость_h2o
Дата 27.10.2005, 14:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











можно так? :
Код

procedure ThreadProc;stdcall;
var NowDate, ArcDate:TDateTime;
begin
  while True do
   begin
    NowDate:=StrToDate(Date);
    ArcDate:=SettingsMenu.g1DateArc.DateTime;
    if NowDate<ArcDate then asm @exit;
    asm
      call MyProc;
    @exit:
    end;
   end;
end;

а всё остальное такое-же.

или как???
  Вверх
Romikgy
Дата 27.10.2005, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Код

procedure ThreadProc;stdcall;    
var NowDate, ArcDate:TDateTime;    
begin    
  while True do    
   begin    
    NowDate:=StrToDate(Date);    
    ArcDate:=SettingsMenu.g1DateArc.DateTime;    
    if NowDate>ArcDate then 
    MyProc;    
    end;    
end;

Можно так smile
Добавлено @ 14:31
Хотя .... неизвестно что делается в
Цитата
MyProc;

и что есть
Цитата
SettingsMenu.g1DateArc.DateTime;

?
VCL в потоках лучше не использовать!!!


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0921 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.