Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

TThread и через CreateThread   Найти похожие ветки 

 
kaZaNoVa   (2004-08-21 09:53) [0]

Сабж :)
Уважаемые мастера, чем отличается юзание потоков через TThread и через CreateThread  ?


 
Sergey_Masloff   (2004-08-21 10:01) [1]

Вобщем-то ничем.


 
jack128 ©   (2004-08-21 11:49) [2]

Удобством..


 
вразлет ©   (2004-08-21 12:01) [3]

во дворе


 
y-soft ©   (2004-08-21 12:07) [4]

Смотря как создается поток с помощью CreateThread и как используется


 
DiamondShark ©   (2004-08-21 12:14) [5]

При создании потока с помощью класса TThread или функцией BeginThread устанавливается системный флаг IsMultithreaded, который влияет на работу менеджера памяти.


 
kaZaNoVa   (2004-08-21 12:50) [6]

То есть лучше TThread юзать ?
или проще CreateThread - и понятнее ..
- никаких execute......


 
Igorek ©   (2004-08-21 13:22) [7]


> DiamondShark ©   (21.08.04 12:14) [5]
> При создании потока с помощью класса TThread или функцией
> BeginThread устанавливается системный флаг IsMultithreaded,
> который влияет на работу менеджера памяти.

Да, действительно.

var IsMultiThread: Boolean;
Description
IsMultiThread is set to True by BeginThread in order to allow the memory manager to execute safely if a VCL application has more than one thread. If a second thread attempts to allocate memory, it is blocked until the first thread exits the memory manager.

Но вот еще вопрос. Я пишу щас на С++ Builder, юзаю CreateThread() из WinAPI. Все потоки юзают динамическое выделение памяти. Но в С++ это new/delete.
Правильно ли использовать в этом случае CreateThread() вместо BeginThread()? Последняя кстати доступна, как
extern PACKAGE int __fastcall BeginThread(void * SecurityAttributes, unsigned StackSize, TThreadFunc
ThreadFunc, void * Parameter, unsigned CreationFlags, unsigned &ThreadId);
в System.hpp

Понятно, что в Дельфи надо юзать BeginThread(). А вот в Билдере тот же менеджер памяти?


 
DiamondShark ©   (2004-08-21 13:40) [8]


> kaZaNoVa   (21.08.04 12:50) [6]
> То есть лучше TThread юзать ?
> или проще CreateThread - и понятнее ..
> - никаких execute......

BeginThread, если с классом не хочется заморачиваться.


 
DiamondShark ©   (2004-08-21 13:45) [9]


> IsMultiThread is set to True by BeginThread in order to
> allow the memory manager to execute safely if a VCL application
> has more than one thread. If a second thread attempts to
> allocate memory, it is blocked until the first thread exits
> the memory manager.

Кстати, пусть слова "VCL application" не вводят в заблуждение. Это касается ЛЮБОГО приложения. Например, работа со строками задействует менеджер памяти.


> Понятно, что в Дельфи надо юзать BeginThread(). А вот в
> Билдере тот же менеджер памяти?

А это важно?
Просто использовать BeginThread. Для единообразия.

Кстати, менеджер памяти точно такой же.


 
Igorek ©   (2004-08-21 13:46) [10]

И еще вопрос. Если юзать BeginThread, то получается, что не надо потом делать CloseHandle(). Т.е. поток автоматом закрывается по завершении работы ThreadFun?


 
Igorek ©   (2004-08-21 13:48) [11]


> по завершении работы ThreadFun?

:-) веселый поток...
ThreadFunc() имел ввиду


 
DiamondShark ©   (2004-08-21 13:50) [12]


> И еще вопрос. Если юзать BeginThread, то получается, что
> не надо потом делать CloseHandle().

Это ещё почему? BeginThread возвращает хэндл потока, точно так же как и CreateThread.

function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
 ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
 var ThreadId: LongWord): Integer;
var
 P: PThreadRec;
begin
 New(P);
 P.Func := ThreadFunc;
 P.Parameter := Parameter;
 IsMultiThread := TRUE;
 Result := CreateThread(SecurityAttributes, StackSize, @ThreadWrapper, P,
   CreationFlags, ThreadID);
end;


 
Igorek ©   (2004-08-21 15:40) [13]


> DiamondShark ©   (21.08.04 13:50) [12]
> Это ещё почему? BeginThread возвращает хэндл потока, точно
> так же как и CreateThread.

Ты конечно прав. Для Дельфи все просто. А вот в Билдере есть грабли.
С одной стороны:

> extern PACKAGE int __fastcall BeginThread(
- System.hpp
С другой:

CloseHandle(HANDLE hObject);
- winbase.h
и

typedef void *PVOID;
typedef PVOID HANDLE;
- winnt.h

И просто написать нельзя:

int hThread2 = BeginThread(...);
...
CloseHandle(hThread2);//[C++ Error] E2034 Cannot convert "int" to "void *"

Надо наверно или приводить:
CloseHandle((void*)hThread2);

Или юзать все таки CreateThread/CloseHandle и самому писать
IsMultiThread = true;. Или полностью сдублировать BeginThread().

Настораживают оба варианта.
Хотя мы и знаем, что Pointer в Дельфи по размеру одинаков с Integer, а в С++ sizeof(int) = (sizeof(void*), но все равно строгая типизация заставляет задуматься - где что не так.

Ну а ручное выставление IsMultiThread тоже не нравиться. В хелпе Билдера этой переменной нету, значит нельзя ее юзать, хотя возможно.


 
Mystic ©   (2004-08-21 16:14) [14]

CreateThread я не рекомендую пользоваться. Есть обвертка BeginThread которой и надо пользоваться... Все остальное от лукавого, потому как у меня просто стойка на CreateThread, ведь установка IsMultihtread может быть абсолютно в другом месте. И ты начинаешь ловить этот баг...

А TThread или BeginThread это уже зависит от задачи. Я, например, если поток должен отработать и умереть самостоятельно использую BeginThread, а если он крутится в цикле и ожидает команды своей остановки извне + должен что-то рисовать, то TThread. В каждом конкретном случае конкретный ответ.



Страницы: 1 вся ветка

Текущий архив: 2004.09.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.031 c
14-1093438693
Cosinus
2004-08-25 16:58
2004.09.12
Помогите найти песню из старой рекламы Nescafe


3-1092395223
REA
2004-08-13 15:07
2004.09.12
Маленький ComboBox


14-1092418248
y-soft
2004-08-13 21:30
2004.09.12
Всемирный день левши


3-1092596419
3APA3A
2004-08-15 23:00
2004.09.12
Блокировка записей в FireBird 1.5


14-1093290195
Vasya.ru
2004-08-23 23:43
2004.09.12
Инсталлятор