![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Гость_Felt |
|
|||
|
Unregistered |
Функция CreateThread может передавать в поток только один параметр, поэтому я решил создать структуру и передать ее. Но теперь Delphi упорно не хочет компилировать этот код. Задача такая: мне нужно передать в поток число и строку, поток должен показать мне значения в диалоговых окнах и завершиться. Использовать глобальные переменные нельзя, так как программа многопользовательская и переменные могут перезаписать другие пользователи, работающие с программой. |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
во-первых: ThreadProc() тоже должна знать о структуре ThreadProcParam поэтому нужно сделать ее публичной
во-вторых: от того, что ты передаеш в ThreadProc структуру параметры ThreadProc не меняются и в-третьих: в ThreadProc должен передаваться адрес структуры, а не она сама, приведенная к указателю -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Программа впадает в бесконечный цикл. |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Ой, млин... Программа просто зависает.
|
|||
|
||||
| Guest |
|
|||
|
Unregistered |
А про использование глобальных переменных я спросил на тот случай если вы вообще откажетесь что то передавать, а посоветуете использовать глобальные переменные.
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
странно что вообще собралось...
т.е. должен передаваться Pointer, который уже в функции должен приводиться к структуре... кажется так ( давно в делфях не сидел ) procedure ThreadProc(Param: Pointer); stdcall; begin ShowMessage(IntToStr(ThreadProcParam(Param^).CommandLine)); ExitThread(0); end; + строки так передавать нежелательно ( нужно через pchar() ) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Не компилируется. Хотя со строками, мне как раз PChar и нужно вызывать, просто я думал что проще будет через String ведь там есть размер строки, а преобразование хотел делать уже внутри потока.
|
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Ой, снова виноват.
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
зависает где?
+ пройдись отладчиком по коду -- посмотри что в ThreadProcParam(Param^).vSocket ( возможно ты просто на Ok не жмеш ) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
Тут всё дело в ShowMessage, т.к. он вызывает GetWindowText, а она работает через WM_GETTEXT. А кто сможет обработать сообщение, если основной поток ждёт завершения созданного потока, т.е. не обрабатывает сообщения ? Тупик!
Сделай так:
-------------------- С уважением, г-н Посол. |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Спасибо, все работает.
|
|||
|
||||
| Guest |
|
|||
|
Unregistered |
А как получить результат работы функции потока, т. е. поточная функция будет не процедурой как у меня, а функцией с возвращаемым значением типа Boolean?
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
во-первых: не bool, а dword ( что за странная тяга прототипы каверкать? )
а во-вторых: GetExitCodeThread() -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Еще раз спасибо, очень помог.
|
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Ну и, наверно, последний вопрос по потокам (очень на это надеюсь!).
Функция Send и мой аналог SendText прекрасно работают в программе, но отказываются работать внутри потока. Я не могу понять почему? До вызова потока WinSock не завершает свою работу, сокет тоже не закрывает. Почему программа отказывается посылать текстовую строку? Если это невозможно, тогда придется сделать так, чтобы поточная функция возвращала строку, а не число (у меня это 0 и 1 - аналоги True и False). |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Хотелось бы добавить: строка
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
как ты собираешс ячто-то посылать если у тебя перед кодом отправки стоит выход из потока:
ExitThread(1); ? -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Все, заработался
P. S. У вас нету своего IRC канала? |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
бывает
насколько я знаю -- нету... есть аськи -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |