|
|
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Вот кусок кода, с помощью которого я вызываю диалог на время выполнения операции. При инициализации, диалог отдает свой хэндл, чтобы потом его можно было закрыть. Но это происходит не всегда. В чём может быть причина? var hPreLoad : HWND; Dummy : DWORD; hThread : HWND; //--------------------------------------------------------- function PreLoadDialogProc(hWndDlg : HWND; Msg : Longint; wParam, lParam : Longint) : Boolean; stdcall; begin Result := False; case Msg of // не всегда выполняется WM_INITDIALOG : hPreLoad := hWndDlg; WM_COMMAND: case LOWORD(wParam) of IDOK, IDCANCEL : EndDialog(hWndDlg, ord(True)); end; end; end; //--------------------------------------------------------- procedure PreLoadDialogThread; begin DialogBox(hInstance, 'ID_PRELOADDLG', 0, @PreLoadDialogProc); end; //--------------------------------------------------------- begin ... hThread := CreateThread(NIL, 0, @PreLoadDialogThread, NIL, 0, Dummy); ... // выполняемая задача SendMessage(hPreLoad, WM_COMMAND, IDOK, 0); // Не всегда hPreload известен, иногда 0 hPreload := 0; if hThread <> 0 then begin WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); hThread := 0; end; ... end; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2008, 20:29 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Жаль отредактировать нельзя, забыл выделить кодом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2008, 20:33 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Типичная ошибка многопоточного программирования )) hPreLoad во втором потоке не успевает инициализироваться перед тем, как его использует SendMessage в первом. Используйте Event (функции CreateEvent, SetEvent и WaitForSingleObject, см. хелп) Кстати, PreLoadDialogThread должна быть функцией function PreLoadDialogThread(p:DWORD):DWORD ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2008, 20:41 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
авторКстати, PreLoadDialogThread должна быть функцией function PreLoadDialogThread(p:DWORD):DWORD Ну она и так функция. Нигде не сказано, что я не могу объявить её Boolean. А вот про Event нужно почитать, чем он в данном случае лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2008, 21:00 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Прошу прощения, не туда глянул. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2008, 21:06 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Просмотрел SDK, MSDN, а также исходники Delphi, но ничего применительно к моему случаю не нашёл. Если не сложно, напишите скелет кода, как это сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2008, 21:34 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Где то тамПросмотрел SDK, MSDN, а также исходники Delphi, но ничего применительно к моему случаю не нашёл. Если не сложно, напишите скелет кода, как это сделать. Вот, ваш код + event (вставки - желтым) Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2008, 22:37 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
То-то я из исходников Delphi ничего не мог понять. Везде CreateEvent идет в паре с CreateThread, а из сказанного Вами ранее я понял, что от CreateThread нужно избавляться. Спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2008, 23:14 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Где то тамя понял, что от CreateThread нужно избавляться. Да мне вот тоже странно: зачем тут поток, если его окончания ждут по WaitForSingleObject... Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 10:45 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Где то тамя понял, что от CreateThread нужно избавляться. Да мне вот тоже странно: зачем тут поток, если его окончания ждут по WaitForSingleObject... Posted via ActualForum NNTP Server 1.4 А разве в MSDN описано по другому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 11:08 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Где то тамА разве в MSDN описано по другому? Неужели в MSDN написано, что диалоги можно показывать только в отдельном потоке? Обычно завершения потоков вообще не ждут... Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 11:14 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Ну вообще так написано в MSDN и так делает Borland. И всем им не верить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 11:32 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Где то там так написано в MSDN и так делает Borland. И всем им не верить? Точные цитаты, пожалуйста, в студию! Мне уже интересно, где это ты нашёл у Борланда диалоги в потоках. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 11:46 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov> Мне уже интересно, где это ты нашёл у Борланда диалоги в потоках. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 11:51 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
В исходники Delphi пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 11:56 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Где то тамВ исходники Delphi пожалуйста. Miln"Url, url." - said Owl. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 12:03 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovДа мне вот тоже странно: зачем тут поток, если его окончания ждут по WaitForSingleObject...Посмотри внимательно код: Код: plaintext 1. 2. Как я понимаю, WaitForSingleObject(hThread, INFINITE); здесь используется только для того, чтоб вызвать CloseHandle(hThread); после завершения потока. Но это совсем необязательно, если закрыть hThread сразу, то с работающим потоком ничего не произойдёт (почему - см. Рихтер). Так что вполне можно сделать так: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 13:05 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
C#C++ Пока диалог на экране, в родительском потоке выполняются действия, после которых подается команда завершения диалога. Именно так. C#C++ Как я понимаю, WaitForSingleObject(hThread, INFINITE); здесь используется только для того, чтоб вызвать CloseHandle(hThread); после завершения потока. Но это совсем необязательно, если закрыть hThread сразу, то с работающим потоком ничего не произойдёт (почему - см. Рихтер). Так что вполне можно сделать так: Код: plaintext 1. А поточнее? Имеется в виду это: было Код: plaintext 1. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 13:17 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Где то тамА поточнее? Имеется в виду это: было Код: plaintext 1. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 13:23 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Не хочется создавать тему ради пары дилетантских вопросов. Немного некромантии. 1. Как в Beginthread/Createthread корректно вызвать процедуру в главном потоке для синхронизации и обновления формы. Synchronize вроде как не вызвать, критическая секция не особо подходит. Сообщение? Событие? Ещё как-то? 2. Тут http://www.delphibasics.ru/BeginThread.php пишут Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Но ^TMsgRecord указатель на тот же участок памяти, отдельных копий же нет? То есть если дальше в главном потоке или в другом потоке что-то меняется, то меняется везде? Почему не делают так? Код: pascal 1. 2. 3. 4. 5. Или я просто не понял чего-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 02:54 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Или я просто не понял чего-то. Видимо Код: plaintext 1. 2. 3. declares an integer type variable that is private to each thread in the application, but global within each thread. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 07:01 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Но ^TMsgRecord указатель на тот же участок памяти, отдельных копий же нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 09:31 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Как в Beginthread/Createthread корректно вызвать процедуру в главном потоке для синхронизации и обновления формы. Synchronize вроде как не вызвать Если, не смотря на все проблемы, таки очень хочется Synchronize - можно написать TThread.Synchronize и передать туда чей-то метод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 09:35 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
YuRock Андрей Игоревич Как в Beginthread/Createthread корректно вызвать процедуру в главном потоке для синхронизации и обновления формы. Synchronize вроде как не вызвать Если, не смотря на все проблемы, таки очень хочется Synchronize - можно написать TThread.Synchronize и передать туда чей-то метод. Если Delphi современная, то можно передать анонимную процедуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 11:09 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
YuRock Андрей Игоревич Но ^TMsgRecord указатель на тот же участок памяти, отдельных копий же нет? Но ^TMsgRecord это же копия указателя, это не "Integer" и не полноценная переменная. Ну просто для понимания тестовый пример: Код: pascal 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. Суть кода выше: По нажатии кнопки присваиваю глобальной переменной Код: pascal 1. Передаю в поток 1 и 2 @DataToTread Далее в потоке 1 "вроде как" локальной копии присваиваю значение Код: pascal 1. В потоке 2 жду 100мс (дабы первый поток успел присвоить) и делаю Код: pascal 1. В главном потоке жду пока всё закончиться sleep(500); Вывожу глобальную переменную Код: pascal 1. И вижу Memo11234 Если бы там были локальные переменные, такого бы не произошло, осталось бы значение 0. Или я всё ещё продолжаю что-то не понимать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 14:45 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 16:57 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичЕсли бы там были локальные переменные, такого бы не произошло, осталось бы значение 0. Или я всё ещё продолжаю что-то не понимать. Походу да, ты продолжаешь не понимать, что у тебя локальные переменные - указатели на глобальный кусок памяти. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 17:09 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Андрей ИгоревичЕсли бы там были локальные переменные, такого бы не произошло, осталось бы значение 0. Или я всё ещё продолжаю что-то не понимать. Походу да, ты продолжаешь не понимать, что у тебя локальные переменные - указатели на глобальный кусок памяти. Ну дак я о том и пишу. Но вот что пишут на delphibasics http://www.delphibasics.ru/BeginThread.php // Указываем указатель на переданные данные // Обратите внимание, что каждый поток имеет отдельную копию msgPtr или товарищи форумчане YuRock Андрей Игоревич Но ^TMsgRecord указатель на тот же участок памяти, отдельных копий же нет? А я не вижу копий, я вижу копию указателя. Потому и спрашиваю. Zelius Андрей Игоревич, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Ну это понятно, но проще уж тогда просто переменную в ThreadVar сразу забить, кода меньше будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 17:48 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичНу дак я о том и пишу. delphibasics// Указываем указатель на переданные данные // Обратите внимание, что каждый поток имеет отдельную копию msgPtr (этого указателя - прим.ред) форумчане Именно отдельные копии (указателя - прим.ред) и будут для каждого потока при threadvar. Ну, вы все пишете одно и то же. Что именно тебя смущает-то?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 17:58 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
А в чем нужда велосипед изобретать? Давно есть высокоуровневые обертки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 18:00 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov delphibasics// Указываем указатель на переданные данные // Обратите внимание, что каждый поток имеет отдельную копию msgPtr (этого указателя - прим.ред) Ну дак во втором предложении суть, там указывают указатель (как коряво звучит), но получают отдельную копию. В указанном примере нет отдельной копии msgPtr, только "ссылка" на него в памяти. // Указываем указатель на переданные данные // Обратите внимание, что каждый поток имеет отдельную копию msgPtr Или фраза "отдельная копия указателя объекта" и "отдельная копия объекта" это одно и то же? Ладно, суть я уже банальным тестированием понял, обновлять главный поток будут через Showmessage. Жаль нет способа поудобнее, всё таки очень громоздко передавать сообщения, мне BeginThread как раз и заинтересовала тем, что намного компактнее, чем класс TThread, а так уже и не так компактно. white_nigger А в чем нужда велосипед изобретать? Давно есть высокоуровневые обертки... Ну я просто осваиваю функционал, читал чужой код, наткнулся, решил разобраться. Ни и показалось, что компактнее чем класс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 18:08 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичВ указанном примере нет отдельной копии msgPtr, только "ссылка" на него в памяти. Бредить не надо. Нет там никакой ссылки. Оператор присваивания копирует значение указателя в локальную переменную. Всё. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 18:11 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Андрей ИгоревичВ указанном примере нет отдельной копии msgPtr, только "ссылка" на него в памяти. Бредить не надо. Нет там никакой ссылки. Оператор присваивания копирует значение указателя в локальную переменную. Всё. Это я про "физический смысл" указателя. "Ссылка" на ячейку в памяти. Ладно, это уже не важно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 18:26 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичЭто я про "физический смысл" указателя. "Ссылка" на ячейку в памяти. Почувствуйте разницу между операторами ":=" и "@". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 18:45 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич white_nigger А в чем нужда велосипед изобретать? Давно есть высокоуровневые обертки... Ну я просто осваиваю функционал, читал чужой код, наткнулся, решил разобраться. Ни и показалось, что компактнее чем класс. Ничего там компактного нет! На первый взгляд так может показаться. А код автоматически становится сложнее, используется тип Pointer, который каждый интерпретирует по своему. Таким потоком сложнее управлять. В голову лезут безумные идеи написания кода, в том числе с использованием threadvar. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 21:36 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
DmSer Андрей Игоревич пропущено... Ну я просто осваиваю функционал, читал чужой код, наткнулся, решил разобраться. Ни и показалось, что компактнее чем класс. Ничего там компактного нет! На первый взгляд так может показаться. А код автоматически становится сложнее, используется тип Pointer, который каждый интерпретирует по своему. Таким потоком сложнее управлять. В голову лезут безумные идеи написания кода, в том числе с использованием threadvar. По-умолчанию потоку под стек мегабайт выделяется обычно, хотя часто за глаза несколько десятков кб хватит. Для 32-бит программ это может быть чрезвычайно критично при запуске нескольких сотен потоков, уж про тысячу не говорю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2020, 00:32 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
DmSer Андрей Игоревич пропущено... Ну я просто осваиваю функционал, читал чужой код, наткнулся, решил разобраться. Ни и показалось, что компактнее чем класс. Ничего там компактного нет! На первый взгляд так может показаться. А код автоматически становится сложнее, используется тип Pointer, который каждый интерпретирует по своему. Таким потоком сложнее управлять. В голову лезут безумные идеи написания кода, в том числе с использованием threadvar. По-умолчанию потоку под стек мегабайт выделяется обычно, хотя часто за глаза несколько десятков кб хватит. Для 32-бит программ это может быть чрезвычайно критично при запуске нескольких сотен потоков, уж про тысячу не говорю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2020, 00:32 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
По-умолчанию потоку под стек мегабайт выделяется обычно, хотя часто за глаза несколько десятков кб хватит. Для 32-бит программ это может быть чрезвычайно критично при запуске нескольких сотен потоков, уж про тысячу не говорю 64-битная винда добавит ещё по 256 КБ на каждый поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2020, 08:56 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
DmSer64-битная винда добавит ещё по 256 КБ на каждый поток. Она, к счастью, даст ещё и офигенного размера адресное пространство, которое позволит не заботиться о таких мелочах. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2020, 13:01 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov DmSer64-битная винда добавит ещё по 256 КБ на каждый поток. Она, к счастью, даст ещё и офигенного размера адресное пространство, которое позволит не заботиться о таких мелочах. К сожалению , если приложение 32-битное, для него сужается адресное пространство в 64-битной винде. Если приложение 64-битное, то про размер стека и адресное пространство можно не задумываться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2020, 14:10 |
|
||
|
CreateThread - проблемы выполнения
|
|||
|---|---|---|---|
|
#18+
DmSer Андрей Игоревич пропущено... Ну я просто осваиваю функционал, читал чужой код, наткнулся, решил разобраться. Ни и показалось, что компактнее чем класс. Ничего там компактного нет! На первый взгляд так может показаться. А код автоматически становится сложнее, используется тип Pointer, который каждый интерпретирует по своему. Таким потоком сложнее управлять. В голову лезут безумные идеи написания кода, в том числе с использованием threadvar. Жуть какая. Буду осторожнее. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2020, 16:26 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2038101]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
159ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
73ms |
get tp. blocked users: |
1ms |
| others: | 253ms |
| total: | 531ms |

| 0 / 0 |
