
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
10.08.2008, 20:29
|
|||
|---|---|---|---|
|
|||
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:33
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
Жаль отредактировать нельзя, забыл выделить кодом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.08.2008, 20:41
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
Типичная ошибка многопоточного программирования )) hPreLoad во втором потоке не успевает инициализироваться перед тем, как его использует SendMessage в первом. Используйте Event (функции CreateEvent, SetEvent и WaitForSingleObject, см. хелп) Кстати, PreLoadDialogThread должна быть функцией function PreLoadDialogThread(p:DWORD):DWORD ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.08.2008, 21:00
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
авторКстати, PreLoadDialogThread должна быть функцией function PreLoadDialogThread(p:DWORD):DWORD Ну она и так функция. Нигде не сказано, что я не могу объявить её Boolean. А вот про Event нужно почитать, чем он в данном случае лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.08.2008, 21:06
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
Прошу прощения, не туда глянул. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.08.2008, 21:34
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
Просмотрел SDK, MSDN, а также исходники Delphi, но ничего применительно к моему случаю не нашёл. Если не сложно, напишите скелет кода, как это сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.08.2008, 22:37
|
|||
|---|---|---|---|
|
|||
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, 23:14
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
То-то я из исходников Delphi ничего не мог понять. Везде CreateEvent идет в паре с CreateThread, а из сказанного Вами ранее я понял, что от CreateThread нужно избавляться. Спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.08.2008, 10:45
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
Где то тамя понял, что от CreateThread нужно избавляться. Да мне вот тоже странно: зачем тут поток, если его окончания ждут по WaitForSingleObject... Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.08.2008, 11:08
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
Dimitry Sibiryakov Где то тамя понял, что от CreateThread нужно избавляться. Да мне вот тоже странно: зачем тут поток, если его окончания ждут по WaitForSingleObject... Posted via ActualForum NNTP Server 1.4 А разве в MSDN описано по другому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.08.2008, 11:14
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
Где то тамА разве в MSDN описано по другому? Неужели в MSDN написано, что диалоги можно показывать только в отдельном потоке? Обычно завершения потоков вообще не ждут... Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.08.2008, 11:32
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
Ну вообще так написано в MSDN и так делает Borland. И всем им не верить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.08.2008, 11:46
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
Где то там так написано в MSDN и так делает Borland. И всем им не верить? Точные цитаты, пожалуйста, в студию! Мне уже интересно, где это ты нашёл у Борланда диалоги в потоках. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.08.2008, 11:51
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
Dimitry Sibiryakov> Мне уже интересно, где это ты нашёл у Борланда диалоги в потоках. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.08.2008, 11:56
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
В исходники Delphi пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.08.2008, 12:03
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
Где то тамВ исходники Delphi пожалуйста. Miln"Url, url." - said Owl. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.08.2008, 13:05
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
Dimitry SibiryakovДа мне вот тоже странно: зачем тут поток, если его окончания ждут по WaitForSingleObject...Посмотри внимательно код: Код: plaintext 1. 2. Как я понимаю, WaitForSingleObject(hThread, INFINITE); здесь используется только для того, чтоб вызвать CloseHandle(hThread); после завершения потока. Но это совсем необязательно, если закрыть hThread сразу, то с работающим потоком ничего не произойдёт (почему - см. Рихтер). Так что вполне можно сделать так: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.08.2008, 13:17
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
C#C++ Пока диалог на экране, в родительском потоке выполняются действия, после которых подается команда завершения диалога. Именно так. C#C++ Как я понимаю, WaitForSingleObject(hThread, INFINITE); здесь используется только для того, чтоб вызвать CloseHandle(hThread); после завершения потока. Но это совсем необязательно, если закрыть hThread сразу, то с работающим потоком ничего не произойдёт (почему - см. Рихтер). Так что вполне можно сделать так: Код: plaintext 1. А поточнее? Имеется в виду это: было Код: plaintext 1. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.08.2008, 13:23
|
|||
|---|---|---|---|
|
|||
CreateThread - проблемы выполнения |
|||
|
#18+
Где то тамА поточнее? Имеется в виду это: было Код: plaintext 1. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
31.07.2020, 02:54
|
|||
|---|---|---|---|
|
|||
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, 07:01
|
|||
|---|---|---|---|
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, 09:31
|
|||
|---|---|---|---|
CreateThread - проблемы выполнения |
|||
|
#18+
Андрей Игоревич Но ^TMsgRecord указатель на тот же участок памяти, отдельных копий же нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
31.07.2020, 09:35
|
|||
|---|---|---|---|
CreateThread - проблемы выполнения |
|||
|
#18+
Андрей Игоревич Как в Beginthread/Createthread корректно вызвать процедуру в главном потоке для синхронизации и обновления формы. Synchronize вроде как не вызвать Если, не смотря на все проблемы, таки очень хочется Synchronize - можно написать TThread.Synchronize и передать туда чей-то метод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
31.07.2020, 11:09
|
|||
|---|---|---|---|
CreateThread - проблемы выполнения |
|||
|
#18+
YuRock Андрей Игоревич Как в Beginthread/Createthread корректно вызвать процедуру в главном потоке для синхронизации и обновления формы. Synchronize вроде как не вызвать Если, не смотря на все проблемы, таки очень хочется Synchronize - можно написать TThread.Synchronize и передать туда чей-то метод. Если Delphi современная, то можно передать анонимную процедуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
31.07.2020, 14:45
|
|||
|---|---|---|---|
|
|||
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. Или я всё ещё продолжаю что-то не понимать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=58&mobile=1&tid=2038101]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
51ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 365ms |

| 0 / 0 |
