· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› тред против процесса

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Июл 1, 2003 00:34:52

Кому процессу или треду винда выделяет больше процессорного времени?


Дата: Июл 1, 2003 02:57:15

То есть как это? Афаик между процесс - неисполнимая вещь. Исполняется как раз тред, который, как известно имеется у каждого процесса хотя бы в одном экземпляре.


Дата: Июл 1, 2003 03:17:45

pas
Кому процессу или треду винда выделяет больше процессорного времени?
Самой себе :))) А меньше всего -- обычным приложениям.


Дата: Июл 1, 2003 16:02:31

офтопичный вопрос - а из .dll можно создать тред пользователя с окном ? а то че-то не получается - пытаюсь из функции по загрузки .dll соорудить тред :

BOOL APIENTRY DllMain( HWND hModule, DWORD ul_reason_for_call, LPVOID
lpReserved )
{

switch (ul_reason_for_call)
{
case 1: file://DLL_PROCESS_ATTACH

MessageBox(NULL, TEXT("Thread starting..."), TEXT("DLL Message"), MB_OK);
hThread = CreateThread(NULL,NULL,WinFunc,hModule,0,&ThrID);

где
DWORD WINAPI WinFunc(LPVOID lParam)
{
MessageBox(NULL, TEXT("Thread started..."), TEXT("DLL Message"), MB_OK);

в результате Thread Starting... видно, а Thread Started нету :/ ... и дебагер на адресах WinFunc не брякается вообще... http://wasm.ru/article.php?article=1001015 - прочитал, но там не из .dll вызывают, хотя указано, что тред может иметь свое окно и т.д. ...


Дата: Июл 1, 2003 16:31:12

pas
Процессы состоят из ТРЕДОВ.
Процесс это просто структура -- описывающая адресное пространство.. и так далее..


Дата: Июл 1, 2003 16:37:22

Drakon_Rider
А какая ошибка вылетает?
Я бы код немного переписал GetLastError/FormatMessage
после вызова функции создания треда.


Дата: Июл 1, 2003 17:37:04

[ Drakon_Rider: а из .dll можно создать тред пользователя с окном ? ]

Однозначно да. С виду код правильный. Посмотри код ошибки после CreateThread, как Edmond сказал.


Дата: Июл 1, 2003 18:44:37

Drakon_Rider
Возможно проблема связана с использованием CreateThread в DllMain. Попробуйте создать обычную экспортируемую ф-цию (вроде DllMainNew) и вызывайте её из главного модуля программы после загрузки DLL.


Дата: Июл 1, 2003 19:17:52

Quantum
Да, ясно что так. Только в чём?!!!


Дата: Июл 1, 2003 20:25:44

Edmond
Я в курсе, что процесс состоит из тредов. Видимо я неправильно задал вопрос. Допустим единственный тред в процессе получает 100 мили сек. Тогда два треда в одном процессе будут получать по 100 или по 50 милисек? Т.е. фиксированно ли кол. выделяемого времени на процесс ( при допустим 3 процессах врема делится на троих) и треды делят это время между собой или время каждому треду выделяется в соответствии с общим количеством тредов во всех процессах.
Вопрос: второй тред в процессе будет иметь больше времени чем если создать его в отдельном процессе?


Дата: Июл 1, 2003 22:30:39

pas
два треда в одном процессе будут получать по 100 или по 50 милисек?
Тогда какой смысл в тредах?


Дата: Июл 1, 2003 23:18:27

Edmond
Я так полагаю, что windows вызывает DllMain когда главный тред DLL ещё не совсем оформлен, т.е. существует вероятность возникновения конфликтной ситуации при попытке создать ещё один тред из пустого места.

ЗЫ: У меня всё равно не получилось воспроизвести вышеописанный глюк.


Дата: Июл 1, 2003 23:30:04

MSDN:
Because DLL notifications are serialized, entry-point functions should not attempt to communicate with other threads or processes. Deadlocks may occur as a result (...)

Drakon_Rider
Кстати, а что происходит после возвращения из DllMain? Возможно MessageBox просто не успевает показаться, если программа заканчивается СРАЗУ после вызова DLL.


Дата: Июл 1, 2003 23:49:29 · Поправил: Four-F

[ pas: Вопрос: второй тред в процессе будет иметь больше времени чем если создать его в отдельном процессе? ]

Нет. Система распределяет процессорное время между потоками, а не между процессам, вне зависимости от того сколько у процесса потоков. Т.е. если есть два процесса - у первого один поток, у второго десять, каждый из одинадцати потокв получит поровну, при условии что у них одинаковый приоритет и им есть чем заняться.



[ Quantum: Я так полагаю, что windows вызывает DllMain когда главный тред DLL ещё не совсем оформлен, т.е. существует вероятность возникновения конфликтной ситуации при попытке создать ещё один тред из пустого места. ]

Нет. Система разрешает потокам что либо выполнять когда они полностью инициализированы. А код DllMain всех длл выполняется главным потоком процесса. В данном случае не принципиально где будет вызвана CreateThread - в DllMain или где-то в другом месте. Я только что набросал код, в котором создание потока происходит в DllMain при получении DLL_PROCESS_ATTACH. Функция потока создает диалог вызовом DialogBoxParam. Ресурс диалога зашит в саму длл. У меня все работает без проблем. Если понапихать MessageBox'ов во все места - тоже работает.


Насчет цитаты из MSDN. В общем случае она конечно верна. Но если длл и созданный из нее поток самодостаточны, т.е. не вызывается никаких функций из других длл (не системных), не нужно синхронизировать свое выполнение с другими потоками, нет обращения к разделяемым данным, то никакого дедлока в принципе не может быть.


Дата: Июл 2, 2003 01:13:01

Four-F
Функция потока создает диалог вызовом DialogBoxParam. Ресурс диалога зашит в саму длл. У меня все работает без проблем.
Пардон. Мне не совсем понятно какое отношение имеет диалог к тредам? Диалог работает потому что модуль уже маппирован в память вместе с ресурсами и его instance является валидным. Instance как-то связан с тредом?

ЗЫ: Код Drakon_Rider у меня прекрасно работает, но всё-таки...

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.071