Форум: "Начинающим";
Текущий архив: 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