Форум: "Потрепаться";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.033 c