C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
WinAPI CreateThread и Win98, я в полной панике!!!
Asher
  Отправлено: 16.10.2003, 10:56


Мастер участка

Группа: Модератор
Сообщений: 550



Создаю Thread через CreateThread
CODE

HANDLE  hTmrThread;          

DWORD WINAPI TmrThreadFunc(LPVOID Sender)//
{                               //Функция потока

return 0;                      //Выйти
}                               //TmrThreadFunc(LPVOID lpvoid)

hTmrThread = CreateThread(NULL, 0, TmrThreadFunc, (void*)this,
 CREATE_SUSPENDED, lpdwTmrThreadID);//Создать поток
if (hTmrThread == NULL)//Если создать не удалось, то      
 CloseHandle(hTmrThread);  
else                          
 SetThreadPriority(hTmrThread, THREAD_PRIORITY_HIGHEST);


в W2K и XP все отлично.
В W98 hTmrThread при создании возвращает NULL. Читать MSDN уже устал. sad.gif
Помогите!!! В чем грабли???
Георгий
Отправлено: 16.10.2003, 21:28


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



А GetLastError что говорит?

из помощи BCB:
QUOTE
Windows 95: CreateThread succeeds only when it is called in the context of a 32-bit program. A 32-bit DLL cannot create an additional thread when that DLL is being called by a 16-bit program.


Может в этом дело?
Asher
Отправлено: 17.10.2003, 08:29


Мастер участка

Группа: Модератор
Сообщений: 550



Подлый GetLastError говорит 0!!!
Один в один эта цитата есть и в MSDN. DLL у меня тут нет, 16-bit приложению тоже взяться неоткуда
Георгий
Отправлено: 17.10.2003, 22:00


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



А попробуй мой проектик запустить — я на нём, как ты помнишь, игрался с много поточностью. А в нём кнопочка CreateThread и создаёт (что впрочем и видно по исходникам) потоки через Win32API. Если и оно работать не будет...

PS. после того, как на работе пересел на QNX, нужды дома держать весь зоопарк ОС (W98, w2000, wXP) от мелкомягких не стало. Причём, даже поиграться с W98 (95) не смогу в ближайшее время т.к. system commander не вовремя вспомнил, что он хочет лицензию и перестал реконфигурироваться sad.gif

User Attached Image Скачать файл
TestThreads.rar


Asher
Отправлено: 18.10.2003, 11:39


Мастер участка

Группа: Модератор
Сообщений: 550



Извините что не пишу все подробности сразу и этим затрудняю осмысление ситуации... biggrin.gif
Я не тот человек, который сразу бежит спрашивать — так я ничего не достиг бы.
После того как чтение MSDN мне надоело, я вспомнил про этот пример, приводимый в сравнение CreateTread и TTread и скачал его. Результат точно такой-же, как и у меня.
если после строки HANDLE hThread; там содержится какой-то мусор (весьма странно — в NT семействе там NULL сразу), то после строки
hThread=CreateThread(NULL,0,ThreadFunc,&ThreadData[i],CREATE_SUSPENDED,0);
hThread все-таки становится в NULL sad.gif

P.S. Для запуска Win98 на рабочей и домашней машине пользуюсь VMWare. Тормоз примерно в 4 раза, но современные машины позволяют это пережиить. Даже Com и LPT порты нормально работают. Проверял и на них, и на нормальных Win98 (в бухгалтерии wink.gif )

Ау, люди!!! Попробуйте кто-нибудь этот пример под Win98, может это у меня в округе они какие-то неправильные MS Win98SE 4.10.2222A
Други версии найти не удается, вымерли. Старые диски растерялись...
Интересно — цифровая информация, CD... А археологи все равно наверное нас будут изучать по найденым материальным носителям (книги, фото, бумажные архивы, etc) Цифровое еще менее долговечно чем аналоговое! 451 по фаренгейту, блин
Георгий
Отправлено: 18.10.2003, 14:25


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



А через TThread работает???

Рея Бредбери ты хорошо вспомнил...

Отредактировано Георгий — 18/10/2003, 15:27
Asher
Отправлено: 18.10.2003, 15:26


Мастер участка

Группа: Модератор
Сообщений: 550



TTread работает, но с ним есть две проблемы. Если внутри вызываемых функций елучается Exception, даже отлавливаемый, то поток иногда отправляется в Suspend и даже иногда из него по Resume не выходит.
Да и тормоз он biggrin.gif
Asher
Отправлено: 30.10.2003, 17:22


Мастер участка

Группа: Модератор
Сообщений: 550



Переставил Win98 и Builder. CreateTread не заработал, но GetLastError начал говорить 87 ("Параметр задан неверно") sad.gif

P.S. Нахрена заказчику поддержка W98? sad.gif
Asher
Отправлено: 30.10.2003, 18:12


Мастер участка

Группа: Модератор
Сообщений: 550



Пошел монолог biggrin.gif
Забил я его все-таки.
По описанию
CODE

HANDLE CreateThread(

   LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes  
   DWORD dwStackSize, // initial thread stack size, in bytes
   LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function
   LPVOID lpParameter, // argument for new thread
   DWORD dwCreationFlags, // creation flags
   LPDWORD lpThreadId  // pointer to returned thread identifier
  );

Для Win95/98/Me параметр lpThreadId не должен быть NULL. Это я все делал, но реально работает только если

LPDWORD lpdwThreadID; //ID потока

hThread = CreateThread(NULL, 0, ThreadFunc, (void*)this,
CREATE_SUSPENDED, (LPDWORD)&lpdwThreadID);//создаем поток

"Правильная" конструкция (LPDWORD)&lpdwThreadID, где lpdwThreadID типа LPDWORD меня УДИВИЛА. ohmy.gif
Георгий
Отправлено: 30.10.2003, 21:33


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Указатель на указатель, который указывает на ячейку памяти, куда записать идентификатор потока?
Над этим надо подумать ( "Третим будешь?" "Да." "Тогда найди второго!")

Вернуться в Вопросы программирования в C++Builder