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

Вниз

Класс в Thread   Найти похожие ветки 

 
Bent   (2004-05-24 18:41) [0]

По нажатию кнопки,делаются трейды,в каждом делается класс,
в нем таймер работающий 10 сек,и заверш трейд.
Но не работает таймер

type
TRA = class
Ti:TTimer;
constructor Create;
destructor Destroy;
procedure KillTime(Sender: TObject);
end;

procedure Thre;stdcall;
var
x:TRA;
ch:dword;
begin
x:=TRA.Create ;
end;

procedure TForm1.Button1Click(Sender: TObject);
var // Нажатием делаем трейды
dz:dword;
begin
dz:=1;
CreateThread(nil,0,@THRE,0,0,dz);
dz:=2;
CreateThread(nil,0,@THRE,0,0,dz);
.....
dz:=24;
...
end;
//
procedure TRA.KillTime; // Timer !
//Sender: TObject);{<-подставив тоже неработает}
begin
Ti.Enabled:=false; // OFF
{.....code.....}
// отрабатываем свой код и завершаем трейд
end;

constructor TRA.Create;
begin
inherited Create;
Ti:=TTimer.Create(application);
Ti.Interval:=10000; // 10 cek
Ti.OnTimer:=KillTime; // должна работать процедура,
  //но не работает
Ti.Enabled:=True;
end;
-------------------------------------------
Экаперементы с предком TComponent тоже неслышит,
что неправельно в коде?


 
Polevi ©   (2004-05-24 18:50) [1]

не работает потому что в доп. потоках нет цикла выборки сообщений
непонятно зачем тут вообще таймер

procedure Thre;stdcall;
var
x:TRA;
ch:dword;
begin
 sleep(10000); // 10 cek
// отрабатываем свой код и завершаем трейд
end;


 
Bent   (2004-05-25 16:23) [2]

таймер нужен для того,чтоб через 10 сек,трейд в завершлся
не важно,что не успел,а может подвис.

Я еще хочу сделать таймер,котор проверяет условие
и выполняет код..Но пока оставил один,что б отладить
простую ситуацию-но не работает.
Как все таки отработать таймер?
>цикла выборки сообщений
а где взять (MSg)


 
Sandman25+1   (2004-05-25 16:31) [3]

[2] Bent   (25.05.04 16:23)

Запоминайте ссылку на thread в главнои потоке. Таймер поставьте тоже в главном потоке и при его срабатывании вызывайте Terminate у соответствующего thread-а. Thread должен проверять Terminated в Execute, иначе ничего не получится.


 
Тимохов ©   (2004-05-25 16:52) [4]

Автору.
1. Как седать таймер - см. модуль extctrls по сторке поиска ttimer.
2. Очередь сообдений - см. модуль forms по строке поиска peekmessage.

ЗЫ. Таймер вам нафиг здесь не нужен.


 
panov ©   (2004-05-25 17:23) [5]

Если все же нужен таймер, то вот на простой код, разберись, и сделай как тебе нужно:


unit Unit1;

interface

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

type
 TProcedureCallBackSimpleTimer=procedure(Sender: TObject);

 TSimpleTimer=class(TThread)
   FCS: RTL_CRITICAL_SECTION;
   FEvent: THandle;
   FInterval: Integer;
   FEnabled: Boolean;
   FOnTimer: TProcedureCallBackSimpleTimer;
   FCheckSuspended : Boolean;
 private
   procedure Timer;
   procedure SetEnabled(const aEnabledTimer: Boolean);
   procedure SetCallback(const Proc:TProcedureCallBackSimpleTimer);
 protected
   procedure Execute;override;
 public
   constructor Create;
   destructor Destroy;override;

   property Interval: Integer read FInterval write FInterval;
   property Enabled: Boolean read FEnabled write SetEnabled;
   property OnTimer: TProcedureCallBackSimpleTimer
               write SetCallback;
 end;

 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   Button2: TButton;
   Button3: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 TT: TSimpleTimer;

implementation

{$R *.dfm}

constructor TSimpleTimer.Create;
begin
 inherited Create(True);
 FEvent := CreateEvent(nil,True,False,nil);
 if FEvent=0 then raise Exception.Create("Error!");
 FEnabled := False;
 FInterval := 1000;
 FOnTimer := nil;
 FCheckSuspended := False;
 InitializeCriticalSection(FCS);
 FreeOnTerminate := True;
end;

destructor TSimpleTimer.Destroy;
begin
 CloseHandle(FEvent);
 DeleteCriticalSection(FCS);
end;

procedure TSimpleTimer.Timer;
begin
 if Assigned(FOnTimer) then
 begin
   EnterCriticalSection(FCS);
   FOnTimer(Self);
   LeaveCriticalSection(FCS);
 end;
end;

procedure TSimpleTimer.Execute;
begin
 while not Terminated do
 begin
   if Terminated then Break;
   WaitForSingleObject(FEvent,FInterval);
   if FCheckSuspended then
   begin
     FCheckSuspended := False;
     Continue;
   end;
   Timer;
 end;
end;

procedure TSimpleTimer.SetEnabled(const aEnabledTimer: BOolean);
begin
 FEnabled := aEnabledTimer;
 if FEnabled
   then Resume
   else
   begin
     Suspend;
     FCheckSuspended := True;
   end;
end;

procedure TSimpleTimer.SetCallBack(const Proc:TProcedureCallBackSimpleTimer);
begin
 FOnTimer := Proc;
end;

procedure MCallBack(Sender: TObject);
begin
 Form1.Memo1.Lines.Add("Тик-Так");
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 TT := TSimpleTimer.Create;
 TT.Interval := 1000;
 TT.OnTimer := @MCallBack;
 TT.Enabled := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 TT.Enabled := not TT.Enabled;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 TT.Terminate;
end;

end.


 
Bent   (2004-05-26 00:05) [6]

Спасибо всем.попробую.Таймер точно надо



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

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

Наверх




Память: 0.49 MB
Время: 0.049 c
14-1084547430
lancelot
2004-05-14 19:10
2004.06.06
Полный абзац


1-1085549054
Vilux
2004-05-26 09:24
2004.06.06
RichEdit->HTML


1-1085647677
Dysan
2004-05-27 12:47
2004.06.06
доступ к классу описанному в dll ?


1-1085002205
Иван Р.
2004-05-20 01:30
2004.06.06
Нарисовать объект на карте в ГИС ИнГео


6-1081493685
oaken
2004-04-09 10:54
2004.06.06
Web Applications -> CrossPlatform