PDA

Просмотр полной версии : Delphi [Console App + TThread]


qPhoenix
19.10.2006, 19:33
Собсно ламерский вопросец - можно ли, и как организовать многопоточность в консольном приложении?

в чем у меня лажа?...:

делаю так:
program Project1;

{$APPTYPE CONSOLE}

uses Classes;

type
Thread = class(TThread)
procedure Execute; override;
end;

procedure Thread.Execute;
begin
writeln('lol');
end;

begin
Thread.Create(false);
end.
Непашет... :(
Затем ради интереса проделываю аналогичное с использованием формы:
unit Unit1;

interface

uses Forms, StdCtrls, Classes, Controls;

type
TForm1 = class(TForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
end;

Thread = class(TThread)
procedure Execute; override;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure Thread.Execute;
begin
Form1.Label1.Caption:='lol';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Thread.Create(false);
end;

end.
Фсе гламурно пашет...

В чем грабли? :(

qPhoenix
19.10.2006, 19:48
Не катит... :(

qPhoenix
19.10.2006, 19:57
Аналогично... :rolleyes:

W!z@rD
19.10.2006, 22:05
Thread = class(TThread)
procedure Execute; override;
end;

когда создаешь класс, необходимо "создавать" класс... В пример тот же TStrings/TStringList/...

sn0w
25.10.2006, 16:50
DWORD WINAPI threadfunc()
{
printf("lol");
Sleep(1000);
return 0;
}

void main()
{
HANDLE hthread;
hthread = CreateThread(...);

WaitForSingleObject(hthread, INFINITE);
}

можт результата не видишь потому что главный поток соскакивает до того как второй закончит исполнение. для этого WaitFor...

da_ff
27.10.2006, 22:22
Ту сноу! вместо слип(1000) тоже можно использовать ВаитФоСинглОбжект с нулевым событием и задержкой на 1000. Это вроде меньше ресурсов жрет.

ZaCo
27.10.2006, 22:30
2da_ff эээ какие там еще ресурсы сжираются?

blackybr
27.10.2006, 22:48
да.. WaitSingleObject() следит за всеми трэдами.. и никакой слип не нужен )

gemaglabin
27.10.2006, 22:55
Вот этот код стопроцентно работает


program Project1;

{$APPTYPE CONSOLE}

uses
Classes,StdCtrls;

type
Thread = class(TThread)
procedure Execute; override;
end;

procedure Thread.Execute;
begin
writeln('lol');
end;

begin
Thread.Create(false);
end.


Скриншот прилагается - возможно ты не правильно компилируешь,попробуй cntrl+F9 ( компиляция без запуска ) %)

http://img112.imageshack.us/img112/4570/console1yv6.png

ZaCo
27.10.2006, 23:22
2гема нахрена для этого еще класс этот дурацкий использовать? у снега все понятнее, проще и более того правильнее)

sn0w
30.10.2006, 15:51
2da_ff: прочти этот fucking manual, и осмысли предназначение Sleep() и WaitForSingleObject()