![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Надо делать одно и тоже в потоке или нет [D7, XP]
SQLEXPRESS © (2011-07-20 11:50:00)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, запускается.
результатов не жду, просто отработает и все
Вопрос.
Функции/процедуры аналогичные
дублировать их было бы неправильно.
Можно ли написать процедуру (просто, где то в отдельном модуле), которую бы использовал и класс в основном потоке и дополнительный поток? Или же обязательно потоку иметь код, описанный внутри, в своем классе?
SQLEXPRESS (2011-07-20 17:46:00) [1]про поручения - это ты загнул знатно :)
ну все равно спасибо. и всем ответившим тоже :)
все получается на первый взгляд.
sniknik (2011-07-20 17:42:00) [2]серьезно персональные поручения только за деньги... и не на этом сайте, а на общем форуме выкладывай для всех желающих посмотреть, а не адресно... могут и закрыть... http://www.delphimaster.ru/forums.shtml#ruleп.10.
SQLEXPRESS (2011-07-20 17:25:00) [3]я серьезно вообще то
SQLEXPRESS (2011-07-20 15:46:00) [4]а можно тебе весь модуль вышлю?
мастер класс дашь :)
SQLEXPRESS (2011-07-20 15:45:00) [5]Николай, не понял
у меня когда
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;
sniknik (2011-07-20 15:27:00) [6]> у меня там критическая секция
зачем тебе тогда поток? ведь это единственный вызов в Execute, и в вызванной процедуре оказывается секция...
убери все нафиг.
> уже переписал одну процедуру - вроде работает :)
ну а почему бы и нет... если убрать "отвлекающие факторы" в виде потоков/секций, у тебя похоже простой вызов процедуры в основном потоке.
"фокус покус" другими словами.
SQLEXPRESS (2011-07-20 14:28:00) [7]уже переписал одну процедуру - вроде работает :)
SQLEXPRESS (2011-07-20 14:24:00) [8]
> 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 с данными, показывается.
sniknik (2011-07-20 14:01:00) [9]> я понимаю..
> ссылки, но по ссылкам я беру данные и создаю их копии.
а похоже, что нет... потому что пока ты "берешь" в другом потоке может быть параллельное "меняешь".
> да там тоже ничего не понятно, что приводить..
+1 к тому что не понимаешь. иначе бы знал критичные места, и это явно не банальный вызов процедуры, а ее код.
> т.е. CreateAndShow делает так:
? передать в create MethodToRun нельзя? и что CreateAnd Showв потоке? говорил же что нет внешнего ничего, а что и в каком потоке собираешься показывать?
SQLEXPRESS (2011-07-20 13:14:00) [10]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;
Anatoly Podgoretsky (2011-07-20 12:10:00) [11]> SQLEXPRESS (20.07.2011 11:50:00) [0]
Где код Execute
sniknik (2011-07-20 12:10:00) [12]> т.е. работающую только с переданными переменными
по переданным значениям или ссылкам? разница есть, смотря как объявлено.
SQLEXPRESS (2011-07-20 12:01:00) [13]ясно, спасибо
SQLEXPRESS (2011-07-20 12:01:00) [14]понимаю, но реальный код тут приводить смысла нет.
хорошо..
Может ли поток из метода Execute вызывать функцию (не обращающуюся к объектам никакого другого потока, т.е. работающую только с переданными переменными), пусть, для определенности, описанную в другом модуле, как просто функция.
ну, а-ля
interface
procedure A(b:byte);
implementation
procedure A(b:byte);
begin
repeat inc(b) until b < 10;
end;
При условии, что ее, эту же функцию, могут вызывать другие потоки.
Можно ее смело вызывать?
или ее надо продублировать внутри класса-потока?
sniknik (2011-07-20 11:57:00) [15]> которую бы использовал и класс в основном потоке и дополнительный поток?
главное к внешним данным в нем одним и тем же не обращаться... "чистый" код пофигу где находится, локальные данные (переменные) не "пересекутся", т.к. в стеке для каждой процедуры выделяются.
Вариант (2011-07-20 11:54:00) [16]
> SQLEXPRESS
> Можно ли написать процедуру (просто, где то в отдельном
> модуле), которую бы использовал и класс в основном потоке
> и дополнительный поток?
Можно
Игорь Шевченко (2011-07-20 11:52:00) [17]в потоке сознания явно не надо