Форум: "Основная";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
ВнизПрикол с TThread Найти похожие ветки
← →
Борис (2002-11-21 14:21) [40]Digitman
Дык, так там получается, что вся работа все-равно выполняется в основном потоке (точнее основной останавливается, ожидая когда законитя другой). имхо.
А вот по-моему и ссылочка: http://delphi.mastak.ru/articles/thread/index.html
и вот тоже ссылочка
http://delphi.mastak.ru/articles/http/index.html
вообще вначале я изучал по этой статье и начались косяки, пришлось разбираться и вникать.
← →
Digitman (2002-11-21 14:49) [41]Ну ! Видел я эту статью)
С одной стороны, ему, <Кариху Николаю>, и надо бы кой-чего "подкрутить") ... Читаем эту "чушь"
>Приведем небольшой пример того, как можно создать отдельный > процесс:
(далее, по приведенному тексту примера, идет речь вовсе не о процессах , а о код.потоках)
>Пример 1. "Шаблон" для создания Thread-ов.
А вот это должно насторожить любого : Слово "шаблон" взято в кавычки ! И - правильно взято !
Нигде нет ни слова о том, в каких случаях нужен этот "шаблон" и что в нем и для чего реально делается...
← →
Smithson (2002-11-21 15:07) [42]Ээээээээ, родной, не горячись. Для советского программиста слова поток и процесс - синонимы (особо для не работавшего с Novell API).
А "шаблон" - что ж, считай, что это неудачный эвфимизм слова пример.
PS. Я ни сколько не защищаю саму статью, просто предъявленные претензии, на мой взгляд, не совсем обоснованы.
← →
MBo (2002-11-21 15:09) [43]>Smithson
Это почему еще синонимы??????
← →
Digitman (2002-11-21 15:11) [44]>Smithson
Давай уж без панибратства, "родной")
> Для советского программиста слова поток и процесс - синонимы
Чушь. Полная.
> особо для не работавшего с Novell API
Мы тут рассуждаем как бы о Win32
← →
Smithson (2002-11-21 15:26) [45]>MBO
потому как все мы вышли из IBM mainframe, где понятия thread и process имеют чисто косметические различия.
>Digitman
Давай без панибратства. Я не знаю, о чем вы тут рассуждаете, я говорю о привычке мыслить и умении не цеплятся к словам. Извини, если это не описано в доке на Win32.
← →
Digitman (2002-11-21 15:36) [46]
> Smithson
Ну и мысли себе на здоровье)
Но если ты излагаешь свою мысль напоказ, в дан.случае - в публичной статье как рекомендацию, будь уж любезен выверить и "вылизать" каждое слово и каждый термин. Ибо в результате мы имеем ту то, что имеем. А именно - регулярные "приколы" со ссылкой на бездумно "содранный" код и "проглоченную без хлеба" терминологию. Приколы эти - то ли в "процессах", то ли в "тредах", то ли еще хрен знает где ... И при этом таки речь как бы идет все же о Win32 в 1-ю очередь... Откуда , собссно, и "растут ноги"
← →
Игорь Шевченко (2002-11-21 15:42) [47]Smithson © (21.11.02 15:26)
> потому как все мы вышли из IBM mainframe, где понятия thread
> и process имеют чисто косметические различия.
Ну-ка, ну-ка, поподробнее на эту тему, плз, уважаемый ?... Особенно про понятие Thread у IBM MainFrame...
← →
Smithson (2002-11-21 15:42) [48]Good ^-))
Первое китайское правило спора - "прежде чем начинать дисскусию, договорись о терминах". Придумано не то в 3, не то во 2 тысячелетии до нашей эры. До сих пор актуально.
← →
Digitman (2002-11-21 15:48) [49]>Smithson
Не забывай, что здесь, в delphi.mastak.ru, осн.темы дискуссий и споров как правило "вертятся" вокруг строго определенной платформы - Win32. Если - иная платформа, это оговаривается особо.
В Win32 же правила установлены не тобой и не мной и не китайцами.
Хочешь быть причастным к "таинствам" платформы - принимай правила и термины. И не занимайся никчемной философией. Это - для другого места, для "Потрепаться"
← →
Digitman (2002-11-21 16:04) [50]>Smithson
Возьми в руки ноты с "Шуткой" и, прежде чем рассуждать о красоте или безобразии ее гармонии, иди и договаривайся с Людвигом Иванычем Бетховеновым о том, в каком строе следует интерпретировать увиденный на нижней линейке стана значек : как "до" такой-то октавы европейского равномерно темперированного строя или хрен знает чего в хрен знает каком папуасском строе)
← →
Digitman (2002-11-21 16:09) [51]>Smithson
Однако ты не идешь к композитору, а садишься за инструмент и с уверенностью берешь ноту. Вопрос тебе - почему ? А не поспорить ли с кем начсет "стандарта" за неимением под рукой его "изобретателя" и "последователя" ?)
← →
Fantasist (2002-11-22 00:35) [52]
> Но в процессе выполнения OnClose он вызывает
> деструктор TMyThread - который, в свою очередь,
> вызывает WaitFor - теперь основной поток останавливается
>
>
Даже так. Не думал что там деструктор такой умный - думал просто грохает объект и все дела, а поток естессвенно оставляет жить, ну а окно которое должно обработать сообщение CM_EXECPROC естесственно тоже грохается и поток повисает на WaitForSingleObject. Внутрь лень было смотреть. Оказывается все не совсем так.
← →
Fantasist (2002-11-22 00:50) [53]
> А вот по-моему и ссылочка: http://delphi.mastak.ru/articles/thread/index.html
Да, это статьей назвать тяжело. Фактически пересказ хелпа. Ничего не объясняется
← →
Fantasist (2002-11-22 02:20) [54]
> пусть в Thread2.Execute выполняется Synchronize() для каких-то
> целей (разумеется, целей синхронизации неких известных методов
> с осн.потоком)
А интересно, как у тебя в длл работает Synchronize? Он ведь использует SyncList - глобальную переменную, которая для длл совсем не та же самая, что для главного приложения.
← →
Digitman (2002-11-22 08:15) [55]Я описываю ситуацию именно для Д5. Никаких SyncList"ов в Д5 Classes.pas нет.
constructor TThread.Create(CreateSuspended: Boolean);
var
Flags: DWORD;
begin
inherited Create;
AddThread; // здесь окно и создается, если это 1-й экземпляр
FSuspended := CreateSuspended;
Flags := 0;
if CreateSuspended then Flags := CREATE_SUSPENDED;
FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), Flags, FThreadID);
end;
← →
NailS (2002-11-22 11:39) [56]А в шестой Дельфе реализация метода Syncronize и WaitFor претерпела значительные изменения, и теперь код, работавший под пятеркой может доставить несколько бодрых минут в шестой
← →
Digitman (2002-11-22 12:25) [57]>NailS
Д6 у меня нет под рукой.
Попробуй сымитировать приведенную мной ситуацию в Д6:
- построй хост-приложение с "Build With Run-Time Packages" = False;
- построй TestDLL с "Build With Run-Time Packages" = True;
- в осн.потоке хост-процесса создай какую-нибудь форму (видимую) с единственным компонентом TestLabel: TLabel; пусть текст метки изначально = "";
- стартуй в хост-процессе доп.код.поток непосредственным WinAPI-вызовом CreateThread() (или BeginThread - как будет удобней);
- в теле поточной ф-ции загрузи TestDLL и вызови из нее нее ф-цию TestFunc(), передав ей параметром TestLabel;
- в теле TestDLL.TestFunc() создай VCL-поток TestThread: TTestThread;
- в теле TTestThread.DoWork() выполни TestLabel.Caption := "Что-то там";
- в теле TTestThread.Execute() выполни Syncronize(DoWork);
если метка TestLabel в результате обновится, значит, проблема снята, иначе - все как и прежде
← →
reonid (2002-11-22 13:14) [58]Digitman © (22.11.02 12:25)
>- стартуй в хост-процессе доп.код.поток непосредственным WinAPI->вызовом CreateThread() (или BeginThread - как будет удобней);
Вскрытие показало, что в Д5 это это не обязательно. Сойдёт и TThread. Неважно, как создан поток в ЕХЕ, в ДЛЛ идёт свой отсчёт.
А если уж использовать CreateThread - то можно обойтись и без
ДЛЛ.
← →
Digitman (2002-11-22 13:42) [59]
> reonid © (22.11.02 13:14)
> Неважно, как создан поток в ЕХЕ, в ДЛЛ идёт свой отсчёт.
Важно. Если и хост-процесс и DLL-модуль собраны с "Build With Run-Time Packages" = True, то они будут использовать один и тот же экземпляр vcl50.bpl, и блок переменных
var
ThreadLock: TRTLCriticalSection;
ThreadWindow: HWND;
ThreadCount: Integer;
у них будет общий.
Это означает, что, если хост-процесс в основном потоке первым вызовет TTestThread.Create(), то и ThreadWindow будет создано в осн.потоке, что противоречит условиям проблемы.
> если уж использовать CreateThread - то можно обойтись и без ДЛЛ.
Не спорю, можно и обойтись. Но DLL я упомянул для имитации достаточно распространенных "боевых" условий :
- хост-приложение - "чужое", заранее неизвестно, в какой среде оно собрано;
- DLL вполне может быть неким плагином для хост-приложения;
в теле вызова одной из ф-ций плагина необходимо, скажем, создать экз-р формы, стартовать длительные вычисления с использованием TThread, а прогресс-статус вычислений отображать с пом. Synchronize() в этой форме, после завершения/прерывания форму уничтожить и вернуть управление вызывающему хост-процессу
← →
NailS (2002-11-22 14:50) [60]
> Digitman © (22.11.02 12:25)
Synchronize не работает. ;(
← →
Digitman (2002-11-22 14:52) [61]
> NailS
Так я и думал)
С чем и поздравляю "от души"))))
← →
Fantasist (2002-11-22 21:45) [62]
> Я описываю ситуацию именно для Д5. Никаких SyncList"ов в
> Д5 Classes.pas нет.
Нормально! Вот D6 код:
type
TSyncProc = record
Thread: TThread;
Signal: THandle;
end;
.....
procedure TThread.Synchronize(Method: TThreadMethod);
var
SyncProc: TSyncProc;
begin
{$IFDEF MSWINDOWS}
SyncProc.Signal := CreateEvent(nil, True, False, nil);
try
{$ENDIF}
{$IFDEF LINUX}
FillChar(SyncProc, SizeOf(SyncProc), 0); // This also initializes the cond_var
{$ENDIF}
EnterCriticalSection(ThreadLock);
try
FSynchronizeException := nil;
FMethod := Method;
SyncProc.Thread := Self;
SyncList.Add(@SyncProc);
ProcPosted := True;
if Assigned(WakeMainThread) then
WakeMainThread(Self);
{$IFDEF MSWINDOWS}
LeaveCriticalSection(ThreadLock);
try
WaitForSingleObject(SyncProc.Signal, INFINITE);
finally
EnterCriticalSection(ThreadLock);
end;
{$ENDIF}
{$IFDEF LINUX}
pthread_cond_wait(SyncProc.Signal, ThreadLock);
{$ENDIF}
finally
LeaveCriticalSection(ThreadLock);
end;
{$IFDEF MSWINDOWS}
finally
CloseHandle(SyncProc.Signal);
end;
{$ENDIF}
if Assigned(FSynchronizeException) then raise FSynchronizeException;
end;
Обратите внимание на SyncList. В этот лист заносятся методы которые надо выполнить синхронно. Там же в сlasses есть функция ChekSynchronize, которая выполняет все методы из этого листа и активизирует соответствующии ивенты(которые TSyncProc.Signal). Эта функция вызывается Application.WndProc на сообщение WM_NULL, и в Application.Idle. WM_NULL поститься при помощи "события" WakeMainThread из Synchronize - оно инициализируется соответсвующей функцией TApplication.WakeMainThread.
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.01 c