Форум: "Основная";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
ВнизКласс в 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.051 c