Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Контекст кода примерно такой: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. Я извлекаю строку pcds->lpData из полученного сообщения и хочу передать эту строку в отдельный поток. LPCTSTR на входе в поток меня вполне устроит. По крайней мере внутри основного потока (LPCTSTR)(pcds->lpData) дает корректную строчку. Дык вот. Мучаюсь и ничего кроме "Answer:" <абракодабра> ThreadFunc_Answer мне не выводит. А вот код ниже вернет "Answer:STRING DIRECT" : Код: plaintext 1. 2. 3. 4. 5. 6. 7. Но мне то нужно передать строку-параметр. Делается ради того чтоб не держать вызывающее App, чтобы C++ сразу ответил на принятое SendMessage. Тут подробности: Как убрать "подвешивание" вызывающего приложения при передаче SendMessage(WM_COPYDATA)? Не, если ТУ задачу можно решить по-другому, то скажите как. P.S. Я в лабиринте C-шных строк и указателей все равно не разберусь, это паталогия, мне просто надо сделать в конкретном случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2013, 20:51 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77По крайней мере внутри основного потока (LPCTSTR)(pcds->lpData) дает корректную строчку. А память по этому адресу живёт достаточно долго чтобы поток успел ею воспользоваться? Или таки освобождается ещё задолго до этого?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2013, 21:19 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Ну, память я думаю живет минимум до строчки Код: plaintext 1. когда вызывающая SendMessage (WM_COPYDATA) получает свой код возврата. Именно по этой причине WM_COPYDATA нельзя использовать с PostMessage Моя задача как раз считать pcds->lpData, и отфутболить ответ в SendMessage (как только так сразу). А потом уже что-то делать с String = < pcds->lpData > (думаю поток здесь кстати) Ну, да. Скорее всего после return 1; память "пуста". Вопрос как извернуться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2013, 21:41 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77Вопрос как извернуться. Разве не очевидно? Выделить новое место для хранения и скопировать содержимое туда. Вот его-то и передавать потоку. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2013, 22:03 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, И как это сделать? Желательно без глобальной переменной (а вдруг несколько параллельных команд будет - хотя по задуманной логике вряд ли я это разрешу, потому как чтобы давать "следующую" команду, по логике надо знать ответ на "предыдущую", а этот ответ возвращается ф-цией потока). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2013, 22:09 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovРазве не очевидно? Мне не очевидно. В VB6 я бы извернулся так (как вариант, с потоками в VB6 глухо) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. но смысл надеюсь понятен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2013, 22:18 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77Мне не очевидно. Значит тебе надо забыть бейсик и начать изучать работу самого компьютера и программ на нём. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 00:27 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЗначит тебе надо забыть бейсик и начать изучать работу самого компьютера и программ на нём. Dimitry, давай я как нибудь сам разберусь что мне надо забыть и что начать изучать. Я пришел не с воплями "ПА-МА-ГИ-ТЕ ничего не знаю", я пришел с кодом, четко указал место где не получается и попросил помочь конкретно с этим местом кода. При этом честно предупредил, что "в лабиринте C-шных строк и указателей все равно не разберусь" и что "мне просто надо сделать в конкретном случае". Нет проблем, я погуглил и нашел ответ : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. Просто рассчитывал что здесь мне подскажут эти несколько строчек кода быстрее. Что ж, спасибо, пришлось потратить несколько часов на поиск. И я даже не спрашиваю, правильно ли я сделал. Думаю с кодом все в порядке. Работает и иже с ним, вроде все хандлы и потоки закрыл и память очистил (delete [] mystring). Потому что у вас сейчас начнется академическая дискуссия на неделю вперед с миллионом вариантов. От того что я этот код нарыл и подогнал под себя, ясности в понимании char[], char *, const char* reinterpret_cast и т.п. больше не стало. Для себя считаю более разумным и эффективным потратить время на изучение .Net (чем сейчас параллельно занимаюсь), а не на копание в указателях и пропасти сишных строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 03:35 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Хотя нет, один вопрос остался. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. Т.е. мне в реальном коде надо кроме сообщения (строка) передать в ф-цию потока еще и hwndTarget (hwnd окна пославшего сообщение). Стало быть передать структуру через аргумент функции потока. Как это сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 04:19 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Так нормально? Я передаю в ф-цию потока структуру ForSend, которая в свою очередь содержит строку msg, размер которой я задаю динамически (new char[pcds->cbData];) -мог бы написать char msg[1024], но чего память зря транжирить. Код работает как мне надо: 1) сразу возвращает ответ на SendMessage (чтоб вызывающее приложение не висело 5 секунд) 2) корректно передает строку-команду и hwnd вызывающего приложения в поток 3) через 5 сек шлет ответ вызывающему приложению (hwnd) из потока. Интересует в основном ответ на 2 вопроса: 1. Правильно ли я освобождаю память которую я захапал, чтоб передать параметры в поток (то что я выделил в полном коде)? Код: plaintext 1. 2. 2. Правильно ли я грохаю поток. 1) CloseHandle( hThread ); - я делаю сразу, он мне нафик не нужен 2) ExitThread(0); -я делаю в конце ф-ции потока, когда она сделала что мне надо и более не нужна Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 06:04 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77 2. Правильно ли я грохаю поток. 1) CloseHandle( hThread ); - я делаю сразу, он мне нафик не нужен 2) ExitThread(0); -я делаю в конце ф-ции потока, когда она сделала что мне надо и более не нужна Читай Джеффри Рихтер "Windows для профессионалов. Создание эффективных Win32-пpилoжeний с учетом специфики 64-разрядной версии Windows", там про потоки очень подробно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 07:59 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
m_SlaЧитай... Слушай, я вот другую книгу читаю: Джефри Рихтер CLR via C# Ничего? А ты не можешь проще ответить? 1) Да, делаешь правильно. или 2) Нет, не правильно. Допиши строки такие-то, убери строку такую то. или 3) Я не знаю. Я сам еще не дочитал эту книгу. (в этом случае можно ничего не отвечать) Только не обижайся. Но я все-таки не спрашивал что мне прочесть. И я даже не спрашиваю как написать код, я его уже написал, и он рабочий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 08:46 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77...можешь проще ответить?...я его уже написал, и он рабочий. Вам дали правильный и самый толковый ответ. Лучше первоисточник, чем трансляция. Тем более речь не о мысли, а о чисто технических аспектах. Это, что касаемо Рихтера. В частности то, что заюзали Вы - мягко говоря глюкало. У Рихтера разжовано что, как и почему. В добавок это не список статей "аля МСДН", а структурированная и понятно изложенная информация. Что касаемо кода. Он то рабочий (до некоторой степени), но как это сказать - "автогеном через одно место гланды удалять". Ну и по жизни, будете для себя переоткрывать америку несколько раз по данной теме. Обычно делается следующее: делаете класс. при старте потока передаёте this этого класса. Внутри потока приводите указатель на класс и юзаете все его методы и свойства. Так оно просче, понятней и не провалитесь в последствии тонкого льда в дальнейшем. удачи Вам (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 12:52 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, Код: plaintext 1. Все параметры потоку передаются через параметр lparam. Туда можно запихать либо любое значение базовых типов, либо указатель на любой тип данных. При этом вызывающий код преобразует указатель или значение типа в LPARAM, а вызываемый (код потоковой функции) делает обратное преобразование, и оно должно быть именно таким, какое было на входе. Как тебе уже правильно заметил твой тёска, память, на которую ссылаются, должна быть доступна достаточно долгое время, чтобы дочерний поток смог её прочитать. Поэтому что-то типа ссылки на локальную переменную не годится -- вызов потоковой функции асинхронный, сначала вызывается CreateThread, потом код вызывающего потока продолжается, затем через какое-то время начинается дочерний поток и вызывается его функция. Достаточно хороший подход -- выделить память под данные в вызывающем коде род. потока и передать ссылку на неё дочернему, а в дочернем скопировать данные в локальные переменные и память удалить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 12:53 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77Dimitry Sibiryakov, Ну, память я думаю живет минимум до строчки Код: plaintext 1. Этого мало . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 12:55 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, Код: plaintext 1. 2. Если надо передавать несколько параметров, подход такой: объявляешь структуру, содержащую все нужные параметры. создаёшь экземпляр структуры динамически, заполняешь её нужными значениями, указатель передаёшь в CreateThread. на входе в ThreadFunc преобразуешь lPARAM в указатель на структуру, распаковываешь параметры, структуру удаляешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 13:01 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, Код: plaintext 1. Надо передавать АДРЕС, а не саму структуру по значению. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 13:03 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. Однако внутри ForSend можно хранить строку по значению, например, тот же std::string, тогда не надо будет дополнительно ещё выделять динамически память под значение строки (правда, это всё равно сделает сам std::string ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 13:08 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, авторИнтересует в основном ответ на 2 вопроса: 1. Правильно ли я освобождаю память которую я захапал, чтоб передать параметры в поток (то что я выделил в полном коде)? delete [] in->msg; //освобождаю память под строку delete in; //освобождаю память под структуру Правильно. Только при выделени лучше strcpy/strncpy а не strcat -- нелепо как-то. автор2. Правильно ли я грохаю поток. 1) CloseHandle( hThread ); - я делаю сразу, он мне нафик не нужен Не очень. Как правило, родительский поток (главный) не может завершиться прежде, чем все дочерние завершатся. Иначе приложение закроется, а дочерние потоки будут убиты. Если они ещё работали, их работа останется недолеланной. Как правило (в 99% слочаев) в приложениях сохраняют все хендлы дочерних потоков и на выходе из приложения дожидаются их окончания с помощью WaitForXXXX. автор2) ExitThread(0); -я делаю в конце ф-ции потока, когда она сделала что мне надо и более не нужна Это вообще не нужно. Просто return. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 13:13 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
MasterZivКак правило, родительский поток (главный) не может завершиться прежде, чем все дочерние завершатся. Значит Рихтер врёт, когда говорит, что нет такой вещи как "главный поток"?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 14:18 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Спасибо огромное за комментарии. Вот смотри, я поменял: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. MasterZivавтор2. Правильно ли я грохаю поток. 1) CloseHandle( hThread ); - я делаю сразу, он мне нафик не нужен Не очень. Как правило, родительский поток (главный) не может завершиться прежде, чем все дочерние завершатся. Иначе приложение закроется, а дочерние потоки будут убиты. Если они ещё работали, их работа останется недолеланной. Как правило (в 99% слочаев) в приложениях сохраняют все хендлы дочерних потоков и на выходе из приложения дожидаются их окончания с помощью WaitForXXXX. Понимаешь в чем фишка. Я вызываю поток из обработчика SendMessage(WM_COPYDATA) ДРУГОГО приложения. И если я воткну WaitForSingle... (да, читал я об этом) то ДРУГОЕ тоже будет ждать WaitFor, я бы мог _Answer сделать без всяких Thread, но именно чтоб ДРУГОЕ не ждало я и сделал поток. А CloseHandle мне сделать предписано по-любому, и самое простое это сделать сразу, благо это не приводит к принудительному завершению потока. В реальном приложении не Sleep(5000); а функция инициализации телефонного вызова (например по SIP) которая должна вернуть "Уникальный идентификатов" вызова, и этот идентификатор я отправляю назад в ДРУГОЕ приложение, но вызов может устанавливаться не 2 мс, а напр. 3 сек (если не локалка), и я не хочу чтобы ДРУГОЕ приложение висело все это время. >Иначе приложение закроется, а дочерние потоки будут убиты. Если они ещё работали, их работа останется недолеланной. Если приложение закроется в момент инициализации вызова, то начавшийся было телефонный вызов также будет убит, и возврат "Уникального идентификатора" этого вызова мне скорее вреден, отслеживание вызова начинается только после возрата идентификатора. Т.е. я ничем не рискую. С учетом этого комментария надеюсь корректно? А теперь о грустном: Вот как ты сказал MasterZivДмитрий77, Код: plaintext 1. Надо передавать АДРЕС, а не саму структуру по значению. Код: plaintext 1. выдает абракодабру, а при замене strncat на strncpy еще и дает краш приложения. Посмотри, но мне кажется что мой код как раз передает указатель на структуру (звездочка стоит при определении), ForSend *SendPr = new ForSend; Неправ? Но мой то вариант как раз работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 14:27 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovMasterZivКак правило, родительский поток (главный) не может завершиться прежде, чем все дочерние завершатся. Значит Рихтер врёт, когда говорит, что нет такой вещи как "главный поток"?.. Нет, не врет. Потому что он так не говорит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 16:41 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77 Посмотри, но мне кажется что мой код как раз передает указатель на структуру (звездочка стоит при определении), ForSend *SendPr = new ForSend; Неправ? Но мой то вариант как раз работает. Ой, это я напутал, ты прав. Указатель у тебя передается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 16:46 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
MasterZivон так не говорит. Он говорит, что все потоки равноправны и процесс завершается когда завершается последний из них. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 16:53 |
|
||
|
Как передать строковый параметр в CreateThread?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovMasterZivон так не говорит. Он говорит, что все потоки равноправны и процесс завершается когда завершается последний из них. http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx MSDN CreateProcess function Creates a new process and its primary thread . The new process runs in the security context of the calling process. ... The preferred way to shut down a process is by using the ExitProcess function, because this function sends notification of approaching termination to all DLLs attached to the process. Other means of shutting down a process do not notify the attached DLLs. Note that when a thread calls ExitProcess, other threads of the process are terminated without an opportunity to execute any additional code (including the thread termination code of attached DLLs). For more information, see Terminating a Process. ... Отсюда вывод: первый поток приложения, тот, который на выходе зовёт ExitProcess, и в котором вызывается функция main (или WinMain), можно называть главным потоком приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2013, 18:41 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38408309&tid=2019951]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
104ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 211ms |

| 0 / 0 |
