Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Динамические потоки


Автор: appleVin 26.3.2007, 15:27
Доброго времени суток! Подскажите плиз новичку, как динамически создавать потоки  в Delphi? smile 

Автор: ama_kid 26.3.2007, 15:51
посмотри http://forum.vingrad.ru/topic-135432.html#st_0_view_1 мой последний пост - я там прикреплял программулину, разбирайся....

Автор: Snowy 26.3.2007, 15:55
1. А что, их можно создавать не динамически?
2. Под потоками подразумеваются треды или стримы? (и кто только придумал называть треды потоками?)
3. Перенесено в Delphi.

Автор: appleVin 26.3.2007, 16:06
Спасибо, сейчас гляну!  smile

Добавлено через 13 минут и 34 секунды
Цитата

 Под потоками подразумеваются треды или стримы?


 Под потоками подразумеваются треды.  smile 

Автор: Alexeis 27.3.2007, 18:05
Начните с этого http://forum.vingrad.ru/index.php?showtopic=60076

Автор: appleVin 27.3.2007, 23:11
Опишу задачу поподробней:
Есть панель с кнопками, создающимися динамически,
какдая кнопка должна запускать форму из Dll, (не модально), т.е. сколько кнопок - столько и форм из Dll-ок можно запустить...
Т.к. кнопки динамические - то OnClick один:
Код
procedure TMainF.BtnClick(Sender:TObject);
.......
....
lib_name:=f.ReadString(List.Strings[(SenderasTBitBtn).Tag],'lib','');
//глобальная премем. имя библиотеки (Dll)
lib_proc:=f.ReadString(List.Strings[(SenderasTBitBtn).Tag],'startpoint',''); //глобальная ,процедура вызова формы из Dll
hh[(SenderasTBitBtn).Tag]:=loadLibrary(pChar(lib_name));
Thread_num:=(Sender as TBitBtn).Tag;
//определяю номер потока
Z_ST[(SenderasTBitBtn).Tag]:=TZthread.Create(false);
//создаю поток с номером...
......
end;

да, вещё вот такой кусочек :
Код
type
  TZThread = class (TThread)
  protected
  procedure Execute; override;
end;

Массивы:
 
Код
Z_ST: array of TZThread;
       hh: array of THandle;

И обработчик Execute:
Код

procedure TZThread.Execute;
var MyHandl:THandle;
    Go:procedure(DbName,UserName,Pasword:string);
begin
  self.FreeOnTerminate:=true;
  MyHandl:= FindWindow(Nil, '.....');
  if MyHandl<>0 then SetForegroundWindow(MyHandl) else begin
     if hh[Thread_num]<>0 then begin      @GO:=GetProcAddress(hh[Thread_num],pChar(lib_proc));
       GO(DN,UN,PS);
     end else messagebox(Application.Handle,'Отсутствует модуль dll!','Ошибка.',MB_OK+MB_ICONERROR);
.............
  end;
end;

В результате получается вот такоя картина:
если я к примеру открою 3 формы(по 1й из 3х Dll), то, закрывая последнюю, все ок, но закрывая  две  предыдущие - они закрываются и компилятор говорит - "Invalid pointer operation".(((
Получается когда закрывается форма - управление должно передаваться в процеддуру Execute, где-то вот сюда:
Код
GO(DN,UN,PS);

и там должно быть что-то вроде 
Код
Z_ST[...]:=Nil;
и
FreeLibrary(hh[...]);

Но не идет тута ни чего, когда закрываб те 2 не последние формы ((((.
Как быть и что делать, где я не прав???
Подскажите плиз, я оч запутался!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)