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

Поиск:

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


Бывалый
*


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

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



Есть прога. Она состоит из одной формы. При запуске системы моя прога запускается свёрнутой в трэй, и висит там пока я не нажму "ВЫХОД".
А как заставить в это время прогу работать??? Нужно событие и действие типа..
Код

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize; 
  Application.Title := 'Proga';
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  while Application_is_running do
    begin
    ...
    ...
    end;
end.

В форме все настройки и процедуры описаны... и при событии "Пока прога запущена, всё время делать то-то". И вот я в цикле, тока буду запускать процедуры и функции из формы, с настройками из формы!
Как такое замутить?

З.Ы. Про Api вариант знаю... но вроде он тут не подходит... вот он:
Код

program Project1;
uses Windows;
var
Msg: TMsg;
Begin
//Сюда можешь добавлять свой код
// Дальше идет код, который заставит прогу висеть в 
// памяти вечно и не будет сильно грузить систему.
while GetMessage( Msg, HInstance, 0, 0) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end.

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


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


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

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



Создай таймер и засунь туда , все что хошь и пускай се вертится smile


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

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


Бывалый
*


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

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



не, не вариант!и какой я ему счёт поставлю??? неужели нет ничё такого.....
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
_hunter
Дата 26.10.2005, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



ничего не понял. если ты сделал GUI приложение оно и так работает ( отлавливает и обрабатывает сообщения )
если тебе нужно чтобы постоянно выполнялось какое-то действие -- запусти его во потоке...

короче, объясняй подробнее...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
h2o
Дата 26.10.2005, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



_hunter да я вроде и так подробно обьяснил... ну вообщем ещё раз... попробую!

1 прога. 1 форма. Прога при запуске создаётся в трэе. ну да, всё правильно-прога и так висит в памяти и работает, пока её сам не закроеш....дак вот, чтобы запустить операцию... нужно нажать на кнопку, так? да так! а у меня там кнопок нет. я делаю жалкое подобие службы!!!
и мне надо чтобы - конкретно:
1. от старта проги и до выхода из проги, она у меня выполняла действия, без нажатий на клавиши... просто запустил прогу, форма появилась, ты с формой работаешь, меняешь настройки, а в это время прога ничего тебе не говоря, сама на заднем плане что-то делает...
2. что делает прога:
Код

//Project1
program Project1;
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
  Application.Initialize; 
  Application.Title := 'Proga';
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

//Unit1.pas
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}
procedure TForm1.FormCreate(Sender: TObject);
begin
...
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
...
end;
procedure TForm1.MyBackDoorProcedure;
var ...
begin
...
end;

//и вот где-то там в проге как-то нужно сделать
while Моя_программа_работает do
 begin
  Date:=получить системное время;
  Date2UserDate:=27.10.05;
  if Date2UserDate>=Date 
   then MyBackDoorProcedure
   else wait(6 часов);
  end;
// если дата указанная пользователем больше или равна системному времени, то запустить процедуру MyBackDoorProcedure, если нет, то подождать 6 часов, а потом опять проверять условие. И если дата Date2UserDate назначена на срок через неделю, то прога должна висеть всю неделю и проверять условие и ждать своего числа...
end.


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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



ааа... ну тогда, как я уже говорил, в TForm1.FormCreate просто создавай поток и в нем эти действия выполняй.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
h2o
Дата 26.10.2005, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



_hunter smile

я вообще далёк от понятия про потоки! я сам не смогу разобраться буз примера, если не влом, писани.... спасибо!
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Romikgy
Дата 26.10.2005, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



ИМХО здесь поток не нужен, хотя смотря что будет делаться в
Цитата(h2o @ 26.10.2005, 14:51)
MyBackDoorProcedure

если действий не сильно много, т.е. нет больших ресурсоемких расчетов, то проще юзать таймер,
да ожидание на 6 часов проще делать через него smile


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

PM   Вверх
_hunter
Дата 26.10.2005, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



идеш файл, нью, озер, треад обджект.
как-то обзываеш, как-то сохраняеш. в его методе Execute пишеш свои действия.
в главной форме создаеш ( как-то так TMyThread.Create(false) ) все.
( не забываем подключить модуль )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
h2o
Дата 27.10.2005, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



а чё в методе Execute указывать?
1.сначало, нужно указать чтобы поток висел всегда в памяти? и код всех действий вбить?
Для этого вот это?
Код

procedure TThread.Execute;
var Msg: TMsg;
begin
  SetName;
  { Place thread code here }
 //Сюда можешь добавлять свой код
// Дальше идет код, который заставит прогу висеть в 
// памяти вечно и не будет сильно грузить систему.
while GetMessage( Msg, HInstance, 0, 0) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end;

2. TMyThread.Create(false) - это в OnCreate главной формы можно указать или где?
3. Поток вообще сможет работать с компонентами, чекитами, едитами из главной формы?
Добавлено @ 08:02
ввобще мне надо сравнить время системы и указанное мной время и запустить процедуру в главной форме описанную. это возможно? или надо и эту процедуру в поток переносить?
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Alexeis
Дата 27.10.2005, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата
TMyThread.Create(false)

пишется где угодно но перед вызовом execute
Для работы с VCL необходимы защищенные секции - читай статью Петовича в разделе важных тем smile


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

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

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


Бывалый
*


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

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



ничё не получается! вот я так сделал:
Код

unit StartingMyNewThread;
interface
uses
  SysUtils, Unit1, Classes {$IFDEF MSWINDOWS} , Windows {$ENDIF};
type
  MyNewThread= class(TThread)
  private
    procedure SetName;
  protected
    procedure Execute; override;
  end;
implementation
{$IFDEF MSWINDOWS}
type
  TThreadNameInfo = record
    FType: LongWord;     // must be 0x1000
    FName: PChar;        // pointer to name (in user address space)
    FThreadID: LongWord; // thread ID (-1 indicates caller thread)
    FFlags: LongWord;    // reserved for future use, must be zero
  end;
{$ENDIF}
{ ArcThread }
procedure ArcThread.SetName;
{$IFDEF MSWINDOWS}
var
  ThreadNameInfo: TThreadNameInfo;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
  ThreadNameInfo.FType := $1000;
  ThreadNameInfo.FName := 'MyNewThread';
  ThreadNameInfo.FThreadID := $FFFFFFFF;
  ThreadNameInfo.FFlags := 0;
  try
    RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo );
  except
  end;
{$ENDIF}
end;

procedure ArcThread.Execute;
var Msg: TMsg; NowDate, ArcDate:TDateTime;
begin
  SetName;
  NowDate:=StrToDate(Date);  //1
  MyDateForBeginProc:=SettingsMenu.DateTimePicker1.DateTime; //2
  if NowDate>=MyDateForBeginProc then  SettingsMenu.StartingMyBackDoorProcedure; //3
  wait(10000);
while GetMessage( Msg, HInstance, 0, 0) do //чтобы в памяти всегда висела!
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end;
end.


Чёто не так! как сделать чтобы поток всегда висел в памяти и //1 //2 //3 выполнялись всё время.
Тоесть я запустил поток. а дальше он пока работает быдет выполнять //1 //2 потом условие //3 и если условие не верно, то он подождёт wait(10000) а потом опять //1 //2 //3. и если уже верно то он запустит мою процедуру из другой формы... после выполнения процедуры, он опять будет висеть в памяти и выполнять как и прежде //1 //2 //3.
Вот как это сделать...

а да, я ещё выше там вопросов понаписал! ответьтте плиз и на них кто-нибудь!!!
Добавлено @ 09:08
а да, ещё фигня... у меня поток не показывает ХР диспетчер задачь, а вот показывает что прога грузит проц - 90%! это чё- нормально? написано же
Код

// Дальше идет код, который заставит прогу висеть в 
// памяти вечно и не будет сильно грузить систему.
while GetMessage( Msg, HInstance, 0, 0) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;


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


Амеба
Group Icon


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

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



Поток выполняется пока работает execute


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

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

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


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


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

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



Код

procedure ArcThread.Execute;    
var Msg: TMsg; NowDate, ArcDate:TDateTime;    
begin    
while true do
begin  
SetName;    
  NowDate:=StrToDate(Date);  //1    
  MyDateForBeginProc:=SettingsMenu.DateTimePicker1.DateTime; //2    
  if NowDate>=MyDateForBeginProc then  SettingsMenu.StartingMyBackDoorProcedure; //3    
  wait(10000);    
end;
end;



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

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


Бывалый
*


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

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



дак как мне сделать?
Добавлено @ 09:23
Romikgy блин не увидел... шас гляну!
Добавлено @ 09:25
Romikgy
а чё он так будет в памяти висеть... и постоянно через интервал проверять и проверять?
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.

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


 




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


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

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