Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.11.13;
Скачать: CL | DM;

Вниз

Надо делать одно и тоже в потоке или нет   Найти похожие ветки 

 
SQLEXPRESS   (2011-07-20 11:50) [0]

TEW = class
public
 InThread: boolean;
..
 procedure DoWork(i: integer);  
end;

TEW.DoWork(i: integer);
if InTread then
begin
 EWThread := TEWThread.create(true);
 EWThread.resume;
 Exit;
end;
repeat i := i + 1; until i > 10;

------

TEWThread = class(TThread)
..
 procedure DoWork(i: integer);  
end;
тут тоже DoWork(i: integer); - пусть repeat i := i + 1; until i > 10;
результатов не жду, просто отработает и все

смысл действа -
EW := TEW.create;
EW.DoWork(5);
Просто работает

EW := TEW.create;
EW.InThread := true;
EW.DoWork(5);
Создается поток, где описана аналогичная функция DoWork, запускается.
результатов не жду, просто отработает и все

Вопрос.
Функции/процедуры аналогичные
дублировать их было бы неправильно.

Можно ли написать процедуру (просто, где то в отдельном модуле), которую бы использовал и класс в основном потоке и дополнительный поток? Или же обязательно потоку иметь код, описанный внутри, в своем классе?


 
Игорь Шевченко ©   (2011-07-20 11:52) [1]

в потоке сознания явно не надо


 
Вариант   (2011-07-20 11:54) [2]


> SQLEXPRESS


> Можно ли написать процедуру (просто, где то в отдельном
> модуле), которую бы использовал и класс в основном потоке
> и дополнительный поток?

Можно


 
sniknik ©   (2011-07-20 11:57) [3]

> которую бы использовал и класс в основном потоке и дополнительный поток?
главное к внешним данным в нем одним и тем же не обращаться... "чистый" код пофигу где находится, локальные данные (переменные) не "пересекутся", т.к. в стеке для каждой процедуры выделяются.


 
SQLEXPRESS   (2011-07-20 12:01) [4]

понимаю, но реальный код тут приводить смысла нет.
хорошо..

Может ли поток из метода Execute вызывать функцию (не обращающуюся к объектам никакого другого потока, т.е. работающую только с переданными переменными), пусть, для определенности, описанную в другом модуле, как просто функция.

ну, а-ля
interface
procedure A(b:byte);
implementation
procedure A(b:byte);
begin
  repeat inc(b) until b < 10;
end;

При условии, что ее, эту же функцию, могут вызывать другие потоки.

Можно ее смело вызывать?
или ее надо продублировать внутри класса-потока?


 
SQLEXPRESS   (2011-07-20 12:01) [5]

ясно, спасибо


 
sniknik ©   (2011-07-20 12:10) [6]

> т.е. работающую только с переданными переменными
по переданным значениям или ссылкам? разница есть, смотря как объявлено.


 
Anatoly Podgoretsky ©   (2011-07-20 12:10) [7]

> SQLEXPRESS  (20.07.2011 11:50:00)  [0]

Где код Execute


 
SQLEXPRESS   (2011-07-20 13:14) [8]

sniknik ©   (20.07.11 12:10) [6]
я понимаю..
ссылки, но по ссылкам я беру данные и создаю их копии.
так что у всех свои данные.

да там тоже ничего не понятно, что приводить..

procedure TWEThread.Execute;
begin
 inherited;
 case FMethodToRun of
   1: CreateAndShowT;
   2: CreateAndSaveT;
   3: CreateAndSaveAndShowT;
 else
   raise Exception.Create("TWEThread.Execute. Invalid case Method " + IntToStr(FMethodToRun));
 end;
end;


т.е. CreateAndShow делает так:
WEThread.остальное := остальное;
WEThread.MethodToRun := 1
WEThread.Resume;


 
sniknik ©   (2011-07-20 14:01) [9]

> я понимаю..
> ссылки, но по ссылкам я беру данные и создаю их копии.
а похоже, что нет... потому что пока ты "берешь" в другом потоке может быть параллельное "меняешь".

> да там тоже ничего не понятно, что приводить..
+1 к тому что не понимаешь. иначе бы знал критичные места, и это явно не банальный вызов процедуры, а ее код.

> т.е. CreateAndShow делает так:
? передать в create MethodToRun  нельзя? и что CreateAndShow в потоке? говорил же что нет внешнего ничего, а что и в каком потоке собираешься показывать?


 
SQLEXPRESS   (2011-07-20 14:24) [10]


> sniknik ©   (20.07.11 14:01) [9]


> пока ты "берешь" в другом потоке может быть параллельное
> "меняешь".

у меня там критическая секция

CreateAndShow не в потоке,
TWE.CreateAndShow метод, в основном потоке.
там написано

try
   if InThread then
   begin
     FThread := TWEThread.Create(True);
     FThread.DST := FDS;
     FThread.PatternT := FPattern;
     FThread.MethodToRun := 1;
     FThread.FreeOnTerminate := True;
     FThread.Resume;
     Exit;
   end;
 except
   on E:Exception do
   begin
     TError.EMessage := E.Message;
     TError.EClass := E.ClassName;
     raise;
   end;
 end;

и пошло основное тело метода TWE.CreateAndShow
и тут написано тоже самое, что и в

FThread.CreateAndShowT; // это другое, тут ___T, это в потоке


> а что и в каком потоке собираешься показывать?

Создается Word-Excel с данными, показывается.


 
SQLEXPRESS   (2011-07-20 14:28) [11]

уже переписал одну процедуру - вроде работает :)


 
sniknik ©   (2011-07-20 15:27) [12]

> у меня там критическая секция
зачем тебе тогда поток? ведь это единственный вызов в Execute, и в вызванной процедуре оказывается секция...
убери все нафиг.

> уже переписал одну процедуру - вроде работает :)
ну а почему бы и нет... если убрать "отвлекающие факторы"  в виде потоков/секций, у тебя похоже простой вызов процедуры в основном потоке.
"фокус покус" другими словами.


 
SQLEXPRESS   (2011-07-20 15:45) [13]

Николай, не понял

у меня когда
    FThread.DST := FDS;
    FThread.PatternT := FPattern;
вот тут и копируются данные.
    FThread.MethodToRun := 1; // выбор что запустить
    FThread.FreeOnTerminate := True;
    FThread.Resume;

так переписал
procedure TWEThread.SetDST(const Value: TDataSet);
var
 i: Integer;
 BM: TBookmark;
begin
 if Value.IsEmpty then
   raise Exception.Create("TDataSet is Empty");
 try
   Screen.Cursor := -11; // unit Controls; crHourGlass   = TCursor(-11);
   FDST := TClientDataSet.Create(nil);
   FDST.FieldDefs.BeginUpdate;
   FDST.FieldDefs := Value.FieldDefs;
   FDST.FieldDefs.EndUpdate;
   FDST.CreateDataSet;
   FDST.DisableControls;
   BM := Value.GetBookmark;
   Value.DisableControls;
   while not(Value.Eof) do
   begin
     FDST.Append;
     for i := 0 to Value.FieldCount - 1 do
       FDST.Fields[i].Value := Value.Fields[i].Value;
     FDST.Post;
     Value.Next;
   end;
   Value.EnableControls;
   if Value.bookmarkvalid(BM) then
     Value.GotoBookmark(BM);
   Value.FreeBookmark(BM);
   FDST.First;
 finally
   Screen.Cursor := 0; //crDefault
 end;


 
SQLEXPRESS   (2011-07-20 15:46) [14]

а можно тебе весь модуль вышлю?
мастер класс дашь :)


 
SQLEXPRESS   (2011-07-20 17:25) [15]

я серьезно вообще то


 
sniknik ©   (2011-07-20 17:42) [16]

серьезно персональные поручения только за деньги... и не на этом сайте, а на общем форуме выкладывай для всех желающих посмотреть, а не адресно... могут и закрыть... http://www.delphimaster.ru/forums.shtml#rule п.10.


 
SQLEXPRESS   (2011-07-20 17:46) [17]

про поручения - это ты загнул знатно :)
ну все равно спасибо. и всем ответившим тоже :)
все получается на первый взгляд.



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

Текущий архив: 2011.11.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.009 c
4-1251951251
imp
2009-09-03 08:14
2011.11.13
Обработка сообщений от дочерних контролов


4-1251798761
Bordo
2009-09-01 13:52
2011.11.13
Подключение плагина на C++ к программе на Delphi


2-1311063552
Ш-К
2011-07-19 12:19
2011.11.13
Толстые и тонкие клиенты


15-1309890322
Petr V. Abramov
2011-07-05 22:25
2011.11.13
вышел сегодня на новую работу


15-1310648771
SQLEXPRESS
2011-07-14 17:06
2011.11.13
Вот такой прикол нашел.. MSSQL