![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
передача параметров в поток
FREEMAN82 © (2004-04-20 14:34:00)Здравствуйте! Подскажите пожалуйста.Есть функция которую я хочу вызывать в новом потоке с разными параметрами как это реализовать и как получить значение возвращаемое этой функцией.
freeman82 (2004-04-20 16:13:00) [1]Спасибо за ответы!
Reindeer Moss Eater (2004-04-20 16:10:00) [2]Если есть в приложении форма, или просто окно, то в конце Execute потока посылай этому окну сообщение.
В обработчике сообщения запускай новый поток.
freeman82 (2004-04-20 16:07:00) [3]Если скажем запустили 50 потоков и 20 уже отработали,как узнать, что они отработали и запустиь еще 20?
Reindeer Moss Eater (2004-04-20 16:03:00) [4]Не вызывай конструктор потока более чем 50 раз.
freeman82 (2004-04-20 15:58:00) [5]а можно еще вопросик,как сделать чтобы одновременно было запущенно не более скажем 50 потоков.
Reindeer Moss Eater (2004-04-20 15:50:00) [6]Паблик свойству или паблик полю потока присвой его.
freeman82 (2004-04-20 15:48:00) [7]нашел ошибку.
а как теперь получить значение функции из потока?
Reindeer Moss Eater (2004-04-20 15:31:00) [8]Какая ошибка?
Подскажи пожалуйста.
freeman82 (2004-04-20 15:26:00) [9]В чем ошибка подскажи пожалуйста
Reindeer Moss Eater (2004-04-20 15:19:00) [10]А должен залетать?
freeman82 (2004-04-20 15:11:00) [11]unit uThread;
interface
uses
Classes,Windows;
type
TShutdown = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
function shutdown(name,message:string;delay:integer;restart,closeall:boolean):integer;
end;
var
message,name:string;
delay:integer;
restart,closeall:boolean;
implementation
uses umain;
function Tshutdown.shutdown(name,message:string;delay:integer;restart,closeall:boolean):integer;
var
tkp,tkpo:TTokenPrivileges;
zero:DWORD;
hToken:Thandle;
begin
Zero:=0;
if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)then
begin
messagebox(0,'Exit error','OpenProcessToken fail',MB_OK);
exit;
end;
if not LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid) then
begin
messagebox(0,'Exit error','LookupPrivilegeValue fail',MB_OK);
exit;
end;
tkp.PrivilegeCount :=1;
tkp.Privileges[0].Attributes :=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(TtokenPrivileges),tkpo,Zero);
If Boolean(GetLastError()) then
begin
messagebox(0,'Exit error','AdjustTokenPrivileges fail',MB_OK);
exit;
end;
initiateSystemShutdown (PChar(name),PChar(Message),delay,restart,closeall);
result:=GetLastError();
end;
procedure TShutdown.Execute;
var
a:integer;
begin
a:=shutdown(name,message,delay,restart,closeall);
end;
end.
unit uMain;
...
proc1:Tshutdown;
.....
name:='comp1';
.....
proc1:=tshutdown.create(false);
здесь вылетаю.
Reindeer Moss Eater (2004-04-20 14:59:00) [12]А при таком подходе к псевдокоду иначе и быть не может
freeman82 (2004-04-20 14:54:00) [13]procedure TSomeThread.Execute;
begin
case fMode of
Mode1: SomeMethod1(fSomeField1);
Mode2: SomeMethod2(fSomeField2,fSomeField3,fSomeField4);
...
ModeN: AnotherMethod;
end;
end;
при таком подходе вылетает ошибка: значение fSomeField1 'is not component name'
FREEMAN82 (2004-04-20 14:52:00) [14]Спасибо Cobalt ©,попробую.
Reindeer Moss Eater (2004-04-20 14:46:00) [15]procedure TSomeThread.Execute;
begin
case fMode of
Mode1: SomeMethod1(fSomeField1);
Mode2: SomeMethod2(fSomeField2,fSomeField3,fSomeField4);
...
ModeN: AnotherMethod;
end;
end;
Cobalt (2004-04-20 14:37:00) [16]У экземпляра потока есть свойства. Присваивайте ему необходимые значения - и всё будет пучком.
Ес-сно, надо в парамтры функции подставлять эти самые данные из свойств класса потока.