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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.004 c
2-1311432550
Pcrepair
2011-07-23 18:49
2011.11.13
Сервер-клиент РДП. обработка кнопки мыши


2-1311690897
nofical
2011-07-26 18:34
2011.11.13
Работа с ReadProcessMemory, как прочитать данные ячейки?


4-1251951251
imp
2009-09-03 08:14
2011.11.13
Обработка сообщений от дочерних контролов


15-1310311222
Doxer
2011-07-10 19:20
2011.11.13
Уведомления о почте (как в QIP)


15-1310934590
Юрий
2011-07-18 00:29
2011.11.13
С днем рождения ! 18 июля 2011 понедельник





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