Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
7-4646
Serge V. Pyataev
2002-10-01 12:14
2002.12.02
процессы и потоки


14-4572
masterlomaster
2002-11-11 19:26
2002.12.02
билн помогите............


14-4608
Николай Быков
2002-11-12 13:45
2002.12.02
Тут такая штука с неро мп3


8-4516
Dennis S
2002-08-16 23:50
2002.12.02
Text на Image, но...


1-4373
Andre V.
2002-11-22 12:57
2002.12.02
Dockable Form





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