Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-1083243415
DoG
2004-04-29 16:56
2004.06.06
CreateNamedPipe


14-1085033396
Serrrg
2004-05-20 10:09
2004.06.06
Программирование микропроцессоров


3-1084784182
zolg
2004-05-17 12:56
2004.06.06
EDBEngineError: Directory is busy.


3-1084791114
IBNovice
2004-05-17 14:51
2004.06.06
InterBase


1-1085514267
Lena19
2004-05-25 23:44
2004.06.06
прозрачность и Topendialog





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский