|
|
| Посл.отвђт | Сообщен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 у меня прекрасно работает, но всё-таки... |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.071 |