Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.05;
Скачать: CL | DM;

Вниз

Два процесса одновременно   Найти похожие ветки 

 
Greebanyi 2bus ©   (2008-08-25 15:16) [0]

Здрасте, помогогите пожалуйста. Надо написать прогу где будут идти два процесса одновременно. Мне необходимо сделать чтобы одновременно шло время (подскажите как его сделать) и параллельно можно было бы заниматься остальной частью программы, ну там на кнопочки нажимать и т.д.
HELP PLEASE.


 
Сергей М. ©   (2008-08-25 15:18) [1]

А зачем "два процесса" ?
Одного достаточно.


 
Leonid Troyanovsky ©   (2008-08-25 15:21) [2]


> Greebanyi 2bus ©   (25.08.08 15:16)  

> чтобы одновременно шло время (подскажите как его сделать)
> и параллельно можно было бы заниматься остальной частью

TTimer

--
Regards, LVT.


 
Greebanyi 2bus ©   (2008-08-25 16:16) [3]

Ну если Timer поставить в это время разве можно будет еще что то делать? Он же вроде идет типа Delay в Паскале. Ну если воспользоваться Timerom то как сделать так чтобы он показывал сколько времени осталось?


 
DVM ©   (2008-08-25 16:25) [4]


> Greebanyi 2bus ©   (25.08.08 16:16) [3]


unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Timer1: TTimer;
   procedure Timer1Timer(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 caption := FormatDateTime("c", Now);
end;

end.



 
DVM ©   (2008-08-25 16:26) [5]


> то как сделать так чтобы он показывал сколько времени осталось?

До чего осталось? До запуска Большого Андронного Коллайдера?


 
Vlad Oshin ©   (2008-08-25 16:28) [6]

он ничего не показывает, он через время Inteval выполняет единственный свой метод onTimer

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  label1.Caption:=datetimetostr(now);
end;


 
{RASkov} ©   (2008-08-25 16:43) [7]

Развод какой-то, но всеж...
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Timer1: TTimer;
   Edit1: TEdit; //Чёб можно было "что-то" делать пока идет отсчет...
   procedure Button1Click(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 Timer1.Tag:=GetTickCount+60000;
 Timer1.Enabled:=True;
 Button1.Enabled:=False;
 Button2.Enabled:=True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Tag:=(Timer1.Tag-GetTickCount) div 1000;
 Caption:=IntToStr(Tag);
 if Tag<=0 then begin
  Button2.Click;
  ShowMessage("Time off");
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Timer1.Tag:=0;
 Timer1.Enabled:=False;
 Button1.Enabled:=True;
 Button2.Enabled:=False;
end;

end.


 
Loginov Dmitry ©   (2008-08-25 22:55) [8]

> Ну если Timer поставить в это время разве можно будет еще
> что то делать? Он же вроде идет типа Delay в Паскале.


А зачем гадать, мож лучше книжку почитать?


 
Maxick ©   (2008-08-26 08:30) [9]

Даже в паскале выводили часы, которые никому не мешели (яля как в нортон командер).


 
Palladin ©   (2008-08-26 09:34) [10]


> Maxick ©   (26.08.08 08:30) [9]

и что ты сказать этим хочешь?


 
brother ©   (2008-08-26 12:13) [11]

> Он же вроде идет типа Delay в Паскале

жесть... а проверить то никак? Проверь, тебе понравится ;)


 
+koha   (2008-08-27 01:37) [12]

Можно запустить каждый процесс в отдельном потоке и делать свои дела и при этом еще измерять время выполнения потоков через GetProcessTimes
Как - то делал для универа по предмету ТРПП (СИПФУ) пример утилиты, которая запускала несколько программ и подсчитывала время выполнения каждого просесса с изменением приоритетов. Но преподы оказались весма тупыми и нихрена не поняли в чем суть. Пришлось забросить проект в таком не доработанном виде и остался. Реализованы главные процедуры и функции - может что полезное для себя и возмешь из него. но может быть с глюками.

Вот полняя версия с утилитой (недоделанной) http://webfile.ru/2186830

unit ProcessEdit;

interface
uses windows,SysUtils,Dialogs,Classes;

Type
 PTimeRec = ^TimeRec;
 TimeRec = Record
   KernelTimeStart: FILETIME;
   UserTimeStart  : FILETIME;
 end;

Type
 PTimeInfo = ^TProcessTimeInfo;
 TProcessTimeInfo = Record
   KernelTime : TDateTime;
   UserTime   : TDateTime;
   CollapsTime : TDateTime;
   IDLTime    : TDateTime;
   FullTime   : TDateTime;
 end;

function StartProcess(FileName: String): integer;
function ProcessStatus(ProcessID: Integer): Longword;
function StopProcess(ProcessID: Integer): boolean;
function GetPriorityProcess(ProcessID: Integer): String;
Function SetPriontyProcess(ProcessID: Integer; PriorityFlag: DWORD):Boolean;
function FileTimeToDateTime(ft: TFileTime): TDateTime;
function GetProcessTimeInfo(PID: integer; Var TR: TimeRec; Var TimeInfo: TProcessTimeInfo): Boolean;
function SetStartTimeProcess(PID: Integer; Var TR: TimeRec): Boolean;

Var
 TLArray: array of TimeRec;

Const
 ABOVE_NORMAL_PRIORITY_CLASS =  32768;
 BELOW_NORMAL_PRIORITY_CLASS =  16384;
 tFormat = "HH:NN:SS.ZZZ";

implementation

Uses unit1;

{--------------------------- FileTimeToDateTime -------------------------------}
function FileTimeToDateTime(ft: TFileTime): TDateTime;
var
 ft1: TFileTime;
 st: TSystemTime;
begin
 if ft.dwLowDateTime + ft.dwHighDateTime = 0 then Result := 0
 else begin
   FileTimeToLocalFileTime(ft, ft1);
   FileTimeToSystemTime(ft1, st);
   Result := SystemTimeToDateTime(st);
 end;
end;

{--------------------------------- SetStartTimeProcess ------------------------}
function SetStartTimeProcess(PID: Integer; Var TR: TimeRec): Boolean;
Var
   //KernelTimeStart,UserTimeStart,
   CreateTime,Dummy: TFILETIME;
   HProcess: THandle;
   //Stat: LongWord;
begin

 HProcess:=OpenProcess(PROCESS_QUERY_INFORMATION,false,PID);
 if HProcess = 0 then begin
   //ShowMessage("OpenProcess = 0");
   exit;
 end;

 sleep(50);
 GetProcessTimes(HProcess,CreateTime,Dummy,TR.KernelTimeStart,TR.UserTimeStart);

 CloseHandle(HProcess);
end;

{--------------------------- GetProcessTimeInfo ------------------------------}
function GetProcessTimeInfo(PID: integer; Var TR: TimeRec; Var TimeInfo: TProcessTimeInfo): Boolean;
Var
   KernelTimeEnd,UserTimeEnd,CreatTime, Dummy: FILETIME;
   CollapseTime,UserTime,KernelTime,IDLTime: TDateTime;
   CurTime: TSystemTime;
   HProcess: THandle;
begin

 HProcess:=OpenProcess(PROCESS_QUERY_INFORMATION,false,PID);
 if HProcess = 0 then exit;

 GetProcessTimes(HProcess,CreatTime,Dummy,KernelTimeEnd,UserTimeEnd);

 KernelTime   := FileTimeToDateTime(KernelTimeEnd)-FileTimeToDateTime(TR.KernelTimeStart);
 UserTime     := FileTimeToDateTime(UserTimeEnd)-FileTimeToDateTime(TR.UserTimeStart);
 CollapseTime := UserTime + KernelTime;

 GetLocalTime(CurTime);
 IDLTime := SystemTimeToDateTime(CurTime)-FileTimeToDateTime(CreatTime)+CollapseTime;

 TimeInfo.KernelTime  := KernelTime;
 TimeInfo.UserTime    := UserTime;
 TimeInfo.CollapsTime := CollapseTime;
 TimeInfo.IDLTime     := IDLTime;
 TimeInfo.FullTime    := SystemTimeToDateTime(CurTime)-FileTimeToDateTime(CreatTime);

 CloseHandle(HProcess);
 result       := true;
end;

{----------------------------- StartProcess -----------------------------------}
function StartProcess(FileName: String): integer;
var
 StartupInfo: TStartupInfo;
 ProcessInfo: TProcessInformation;
begin
 FillChar(StartupInfo, SizeOf(StartupInfo), #0);
 StartupInfo.cb          := SizeOf(StartupInfo);
 StartupInfo.dwFlags     := STARTF_USESHOWWINDOW;
 StartupInfo.wShowWindow := SW_SHOWNORMAL;

 if Not CreateProcess(nil,
   PChar(FileName), // pointer to command line string
   nil,      // pointer to process security attributes
   nil,      // pointer to thread security attributes
   False,    // handle inheritance flag
   CREATE_NEW_CONSOLE or // creation flags
   NORMAL_PRIORITY_CLASS,
   nil, //pointer to new environment block
   nil, // pointer to current directory name
   StartupInfo, // pointer to STARTUPINFO
   ProcessInfo) then Result:=0
 else
   result:=ProcessInfo.dwProcessId;
   //CloseHandle(ProcessInfo.hProcess);
   //CloseHandle(ProcessInfo.hThread);
end;

{-------------------------------- ProcessStatus -------------------------------}
function ProcessStatus(ProcessID: Integer): Longword;
Var HProcess: THandle;
begin
 HProcess:=OpenProcess(PROCESS_QUERY_INFORMATION,false,ProcessID);
 if HProcess = 0 then exit;
 GetExitCodeProcess(HProcess, result);
 CloseHandle(HProcess);
end;

{------------------------------- StopProcess ----------------------------------}
function StopProcess(ProcessID: Integer): boolean;
Var HProcess: THandle;
   ExtCode: LongWord;
begin
 HProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
 if HProcess = 0 then exit;
 GetExitCodeProcess(HProcess,ExtCode);
 if ExtCode = 0 then exit;
 result:=TerminateProcess(hProcess, DWORD(-1));
 CloseHandle(HProcess);
end;

{------------------------------ GetPriorityProcess ----------------------------}
function GetPriorityProcess(ProcessID: Integer): String;
Var HProcess: THandle;
begin
 HProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
 if HProcess = 0 then begin
    Result:="-";
    Exit;
 end;
 try
 case GetPriorityClass(HProcess) of
   ABOVE_NORMAL_PRIORITY_CLASS : Result := "ABOVE_NORMAL"; //выше обычного
   BELOW_NORMAL_PRIORITY_CLASS : Result := "BELOW_NORMAL"; //ниже обычного
   HIGH_PRIORITY_CLASS         : Result := "HIGH";     //высший
   IDLE_PRIORITY_CLASS         : Result := "IDLE";     //простаивающий
   NORMAL_PRIORITY_CLASS       : Result := "NORMAL";   //обычный
   REALTIME_PRIORITY_CLASS     : Result := "REALTIME"; //критичный по времени
 else
   result:="PRIORITY NIL";
 end;
 finally
   CloseHandle(HProcess);
 end;
end;

{-------------------------------- SetPriontyProcess ---------------------------}
function SetPriontyProcess(ProcessID: Integer; PriorityFlag: DWORD):Boolean;
Var HProcess: THandle;
begin
 HProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
 if HProcess = 0 then Exit;
 result:=SetPriorityClass(HProcess,PriorityFlag);
 CloseHandle(HProcess);
end;

end.


 
Maxick ©   (2008-08-27 05:17) [13]


> Palladin ©   (26.08.08 09:34) [10]

я про то, что в досе на паскале часы делали без delay, и тикали они себе в каком нить уголке и прога работала.. Пример как это можно сделать есть в любом букваре по паскалю. Вот это я и хотел сказать.. причем тут отдельный поток!? или я автора не понял..


 
Palladin ©   (2008-08-27 08:54) [14]

так уж и в букваре? насколько я знаю содержание букварей по паскалю, в них не рассказывается о существовании прерываний. и я вообще не вижу ничего общего между выводом на экран времени и задержкой исполнения.
автору таймера более чем достатьчно. какой космический  разум провел ему аналогию с delay, мне неизвестно

ps. в досе время выводили установкой вектора прерывания таймера


 
Maxick ©   (2008-08-27 12:58) [15]


> Palladin ©   (27.08.08 08:54) [14]
> так уж и в букваре?

Книга "Борланд Паскаль 7" под редакцией не помню чьей. Раздел по ООП, пример с прогой аля БД, там скользом про часики говорится. По крайней мере в приведенном листинге точно есть. И про прерывания в книге вроди как было. Когдато давно ООП в паскале баловал.



Страницы: 1 вся ветка

Текущий архив: 2008.10.05;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.023 c
2-1219413550
zoh
2008-08-22 17:59
2008.10.05
image&amp;text


4-1197319990
ДжонС
2007-12-10 23:53
2008.10.05
JPG загрузить


15-1218485760
s_t_d
2008-08-12 00:16
2008.10.05
Нормализация бд


3-1207533571
yus
2008-04-07 05:59
2008.10.05
Изменить программно парвметры псевдонима БД


2-1219849223
Terasbetoni
2008-08-27 19:00
2008.10.05
Вопрос о создании компонента