Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Вниз

Потоки на WinApi   Найти похожие ветки 

 
Grinder   (2004-01-08 17:37) [0]

Мастера. Подскажите ошибочку.

Вот есть код

Procedure ThreadTime;
begin
timesetwindow.GetInetTime(dtm);
ExitThread(0);
end;

procedure Ttimesetwindow.resbtnClick(Sender: TObject);
begin
createthread(nil, 128, @ThreadTime, self, 0, h1);
end;

При закрытии этого окна после работы потока выводится ошибка

System Error. Code: 1400.
Invalid window handle.

Что она значит? И почему она вывобится после использования потока?


 
panov   (2004-01-08 17:50) [1]

Все дело вот здесь -
timesetwindow.GetInetTime(dtm);


 
Grinder   (2004-01-08 18:05) [2]

Спасибо.
А как сделать чтобы работало :)


 
Polevi   (2004-01-08 18:09) [3]

не надо обращаться к окну, созданному в другом кодовом потоке


 
Grinder   (2004-01-08 18:20) [4]

А как тогда быть?
Компонент синхронизации времени находится на этой форме. Сложновато как-то выкрутиться.

P.S. Вы уж извините за мои такие вопросы. Но просто я недавно работаю с потоками.


 
BiN   (2004-01-08 18:25) [5]

Пользуйся TThread и Synchronize иже с ним - ведь у тебя timesetwindow - это vcl-форма, как я понимаю


 
Grinder   (2004-01-08 18:33) [6]

Да VCL
Попробую. Просто везде на форуме говорят что на winapi лучше работает.


 
BiN   (2004-01-08 18:45) [7]

... winapi лучше работает

фактически все компоненты используют winapi/ Если же тебя не устраивает чересчур громоздкий код дельфи при работе с ВСЛ, то нужно писать приложение с нуля, используя сходные с борландовскими конструкции, пусть и не такие универсальные, но зато компактные.
А TThread - это не VCL, а просто полезный класс, инкапсулирующий в себя функции для работы с объектами системного ядра Windows.


 
Grinder   (2004-01-08 19:50) [8]

Вот решил сделать через Tthread, но что-то не видно работы поотка. Виснит.

type
TTimeThread = class(TThread)
private
GetDateTime:TDateTime;
protected
procedure GetInetTime;
procedure Execute; override;
end;

procedure TTimeThread.GetInetTime;
begin
with timesetwindow do begin
GetDateTime:=now;
okbtn.Enabled:=False;
try
with the_main_form_1983.sysframe.timesync do
begin
progpanel.Show;
Application.ProcessMessages;
Screen.Cursor:=crHourGlass;
Timer.Enabled:=False;
try
indate:=DateTime; (вот место зависания. тут идёт синхронизация времени)
...
end;

procedure TTimeThread.Execute;
begin
Synchronize(GetInetTime);
end;

procedure Ttimesetwindow.resbtnClick(Sender: TObject);
var
TimeThread:TTimeThread;
begin
TimeThread:=TTimeThread.Create(False);
end;

Вот как реализовал всё. Но зависон всё равно идёт. С WinAPI не было. Как думаете почему?
Я всё старался делать как описано тут
http://www.delphimaster.ru/articles/thread/


 
Grinder   (2004-01-08 20:02) [9]

чотбы народ не запутывать, я вот экзампл маленткий написал

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdTime;

type
TForm1 = class(TForm)
IdTime: TIdTime;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
TTimeThread = class(TThread)
private
GetDateTime:TDateTime;
protected
procedure GetInetTime;
procedure Execute; override;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TTimeThread.GetInetTime;
begin
form1.CAption:=DateToStr(Form1.IdTime.DateTime);
end;

procedure TTimeThread.Execute;
begin
Synchronize(GetInetTime);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
TimeThread:TTimeThread;
begin
TimeThread:=TTimeThread.Create(False);

end;

end.



Так вот зависание всё равно происходит.


 
panov   (2004-01-08 20:08) [10]

Рекомендую сначала почитать статьи на сайте.

http://www.delphimaster.ru/articles/thread/index.html
http://www.delphimaster.ru/articles/panov/index.html


 
panov   (2004-01-08 20:09) [11]

Заметил, что ты уже прочитал статью, сорри.


 
panov   (2004-01-08 20:12) [12]

Метод Synchronize выполняется в контексте основного потока, поэтому подход, который реализован у тебя, в корне не верен.

Для работы в потоке тебе придется объекты, которые ты создавал в Design-Time, создавать и реализовывать динамически в Run-Time.


 
Grinder   (2004-01-08 20:22) [13]

Вот сделал в run-time

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdTime;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
TTimeThread = class(TThread)
private
GetDateTime:TDateTime;
protected
procedure GetInetTime;
procedure Execute; override;
end;

var
Form1: TForm1;
dtm:string;

implementation

{$R *.dfm}

procedure TTimeThread.GetInetTime;
var
datetime1:TIdTime;
begin
try
datetime1:=TIdTime.Create(form1);
datetime1.Timeout:=10000;
datetime1.Host:="www.time.com";
dtm:=DateToStr(datetime1.DateTime);
finally
datetime1.Free;
end;
end;

procedure TTimeThread.Execute;
begin
Synchronize(GetInetTime);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
TimeThread:TTimeThread;
begin
TimeThread:=TTimeThread.Create(False);
Caption:=dtm;

end;

end.



А всё равно висит.


 
Grinder   (2004-01-08 20:24) [14]

Кстати, а ведь в статье тоже Design Time компоненты.


 
panov   (2004-01-08 20:39) [15]

unit uTSyncTime;

interface

uses
Classes,
Unit1,
IdDayTime;

type
TSyncTime = class(TThread)
private
FDT: TIdDayTime;
FStr: String;
protected
procedure Execute; override;
procedure Update;
public
constructor Create;
end;

implementation

procedure TSyncTime.Update;
begin
Form1.Memo1.Lines.Add(FStr);
end;

constructor TSyncTime.Create;
begin
inherited Create(True);
FDT := TIdDayTime.Create(nil);
FDT.Host := "time-a.nist.gov";
FreeOnTerminate := True;
Resume;
end;

procedure TSyncTime.Execute;
begin
FStr := FDT.DayTimeStr;
Synchronize(Update);
end;

end.


 
panov   (2004-01-08 20:41) [16]

Забыл деструктор добавить:
destructor TSyncTime.Destroy;
begin
FDT.Free;
inherited;
end;


 
Grinder   (2004-01-08 20:46) [17]

Спасибо огромное. Надо же.
Работает :)


 
panov   (2004-01-08 20:50) [18]

Обрати внимание на строки
FDT := TIdDayTime.Create(nil);
и
Synchronize(Update);

Synchronize используется только для обновления уже полученными данными, процедура Update работает в основном потоке, поэтому Synchronize использут как можно реже.



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

Форум: "WinAPI";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.013 c
1-43619
ghg
2004-03-02 14:52
2004.03.14
закон перехода от одного цвета к другому


1-43477
Yuri Btr
2004-02-29 14:44
2004.03.14
Глюк Label и ScrollBox


3-43315
Денисыч
2004-02-17 00:52
2004.03.14
Как грамотно преобразовать string в integer


4-43960
LOX
2004-01-03 16:40
2004.03.14
PWideChar


1-43563
Maverick
2004-02-27 16:11
2004.03.14
FastReport





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский