Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему зависает поток? 
:(
    Опции темы
PointerToNil
Дата 14.4.2014, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



я бы первым делом избавился от synchronize
совсем
(есть postmessage, events и можно общаться просто через переменные/поля)
synchronize - главный источник проблем начинающих многопоточников
PM MAIL   Вверх
UKRtortik
Дата 14.4.2014, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



А как без синхронизации сделать, я не много не понял.
PM MAIL   Вверх
PointerToNil
Дата 14.4.2014, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



я же ключевые слова давал 
или хотя бы так:
http://codeguide.ru/peredacha-informatsii-...oka-delphi.html
(только postmessage вместо sendmessage)
PM MAIL   Вверх
Poseidon
Дата 14.4.2014, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(PointerToNil @  14.4.2014,  17:23 Найти цитируемый пост)
я бы первым делом избавился от synchronize
С Synchronize запись в Memo делается двумя строчками кода. Извращаться для данной задачи с помощью PostMessage - это как в Питер из Москвы через Владивосток. Можно, но не целесообразно. При любом раскладе, даже с помощью PostMessage, мы передаем управление в VCL-поток для отрисовки Memo. Так почему же не воспользоваться специально предназначенным для этого Synchronize? Ну а общение через переменные - это вообще аут. А как эти переменные в VCL-потоке считывать? Цикл крутить? Таймер задействовать? Synchronize тут правильно использовано.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
UKRtortik
Дата 14.4.2014, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



ну так как мне правильно сделать? В чем у меня ошибка?
PM MAIL   Вверх
Romikgy
Дата 14.4.2014, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



сначала надо определится в каком месте виснет 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
CynicRus
Дата 14.4.2014, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



В 17-ой строке у тебя ошибка. А если серьёзно - загружаешь свой проект, и пошагово смотришь по нажатию F8, где же он тормозит. Предварительно расставив бряки.


Это сообщение отредактировал(а) CynicRus - 14.4.2014, 21:01
PM MAIL   Вверх
UKRtortik
Дата 14.4.2014, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



а что не так в 17 строке?
PM MAIL   Вверх
CynicRus
Дата 14.4.2014, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Цитата(UKRtortik @ 14.4.2014,  21:12)
а что не так в 17 строке?

Это древняя шутка про отсутствие телепатических способностей. К делу отношения не имеет. Просто посмотри под отладчиком.
PM MAIL   Вверх
UKRtortik
Дата 14.4.2014, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



просто не очень понимаю как пользоватся отладчиком....

Добавлено через 1 минуту и 50 секунд
Цитата

Thread Start: Thread ID: 420. Process Project1.exe (5356)
Process Start: F:\Delphi\Project1.exe. Base Address: $00400000. Process Project1.exe (5356)
Module Load: Project1.exe. Has Debug Info. Base Address: $00400000. Process Project1.exe (5356)
Module Load: ntdll.dll. No Debug Info. Base Address: $77A80000. Process Project1.exe (5356)
Module Load: KERNEL32.dll. No Debug Info. Base Address: $77840000. Process Project1.exe (5356)
Module Load: KERNELBASE.dll. No Debug Info. Base Address: $759D0000. Process Project1.exe (5356)
Module Load: OLEAUT32.dll. No Debug Info. Base Address: $75410000. Process Project1.exe (5356)
Module Load: ADVAPI32.dll. No Debug Info. Base Address: $75FA0000. Process Project1.exe (5356)
Module Load: USER32.dll. No Debug Info. Base Address: $75A90000. Process Project1.exe (5356)
Module Load: GDI32.dll. No Debug Info. Base Address: $75EA0000. Process Project1.exe (5356)
Module Load: VERSION.dll. No Debug Info. Base Address: $750A0000. Process Project1.exe (5356)
Module Load: ole32.dll. No Debug Info. Base Address: $75140000. Process Project1.exe (5356)
Module Load: COMCTL32.dll. No Debug Info. Base Address: $6DB00000. Process Project1.exe (5356)
Module Load: msvcrt.dll. No Debug Info. Base Address: $75260000. Process Project1.exe (5356)
Module Load: WS2_32.dll. No Debug Info. Base Address: $77970000. Process Project1.exe (5356)
Module Load: SHELL32.dll. No Debug Info. Base Address: $76380000. Process Project1.exe (5356)
Module Load: COMDLG32.dll. No Debug Info. Base Address: $75DD0000. Process Project1.exe (5356)
Module Load: WINSPOOL.DRV. No Debug Info. Base Address: $75040000. Process Project1.exe (5356)
Module Load: OLEACC.dll. No Debug Info. Base Address: $6FAE0000. Process Project1.exe (5356)
Module Load: WINMM.dll. No Debug Info. Base Address: $70B60000. Process Project1.exe (5356)
Module Load: combase.dll. No Debug Info. Base Address: $77700000. Process Project1.exe (5356)
Module Load: RPCRT4.dll. No Debug Info. Base Address: $75920000. Process Project1.exe (5356)
Module Load: SECHOST.dll. No Debug Info. Base Address: $75890000. Process Project1.exe (5356)
Module Load: NSI.dll. No Debug Info. Base Address: $76370000. Process Project1.exe (5356)
Module Load: SHLWAPI.dll. No Debug Info. Base Address: $75E60000. Process Project1.exe (5356)
Module Load: WINMMBASE.dll. No Debug Info. Base Address: $70A10000. Process Project1.exe (5356)
Module Load: SspiCli.dll. No Debug Info. Base Address: $75120000. Process Project1.exe (5356)
Module Load: CRYPTBASE.dll. No Debug Info. Base Address: $75110000. Process Project1.exe (5356)
Module Load: SHCORE.dll. No Debug Info. Base Address: $73320000. Process Project1.exe (5356)
Module Load: bcryptPrimitives.dll. No Debug Info. Base Address: $750B0000. Process Project1.exe (5356)
Module Load: IMM32.dll. No Debug Info. Base Address: $753F0000. Process Project1.exe (5356)
Module Load: MSCTF.dll. No Debug Info. Base Address: $76290000. Process Project1.exe (5356)
Module Load: UxTheme.dll. No Debug Info. Base Address: $70B90000. Process Project1.exe (5356)
Module Load: dwmapi.dll. No Debug Info. Base Address: $70B00000. Process Project1.exe (5356)
Module Load: WTSAPI32.dll. No Debug Info. Base Address: $73A10000. Process Project1.exe (5356)
Module Load: WINSTA.dll. No Debug Info. Base Address: $739D0000. Process Project1.exe (5356)
Thread Start: Thread ID: 4928. Process Project1.exe (5356)
Module Load: OLEPRO32.DLL. No Debug Info. Base Address: $69830000. Process Project1.exe (5356)
Thread Start: Thread ID: 668. Process Project1.exe (5356)
Module Load: SETUPAPI.dll. No Debug Info. Base Address: $760E0000. Process Project1.exe (5356)
Module Load: CFGMGR32.dll. No Debug Info. Base Address: $75320000. Process Project1.exe (5356)
Module Load: DEVOBJ.dll. No Debug Info. Base Address: $75BB0000. Process Project1.exe (5356)
Thread Start: Thread ID: 920. Process Project1.exe (5356)
Module Load: CLBCatQ.DLL. No Debug Info. Base Address: $75370000. Process Project1.exe (5356)
Module Load: PROPSYS.dll. No Debug Info. Base Address: $6D8C0000. Process Project1.exe (5356)
Module Load: profapi.dll. No Debug Info. Base Address: $74090000. Process Project1.exe (5356)
Module Load: WindowsCodecs.dll. No Debug Info. Base Address: $69850000. Process Project1.exe (5356)
Module Load: thumbcache.dll. No Debug Info. Base Address: $73EC0000. Process Project1.exe (5356)
Module Load: MSIMG32.dll. No Debug Info. Base Address: $6F8C0000. Process Project1.exe (5356)
Module Load: Security.dll. No Debug Info. Base Address: $6FD30000. Process Project1.exe (5356)
Module Load: Secur32.dll. No Debug Info. Base Address: $74020000. Process Project1.exe (5356)
Module Load: IEFRAME.dll. No Debug Info. Base Address: $67340000. Process Project1.exe (5356)
Module Load: iertutil.dll. No Debug Info. Base Address: $75530000. Process Project1.exe (5356)
Module Load: fwpuclnt.dll. No Debug Info. Base Address: $733E0000. Process Project1.exe (5356)
Module Load: IdnDl.dll. No Debug Info. Base Address: $73AC0000. Process Project1.exe (5356)
Module Load: Normaliz.dll. No Debug Info. Base Address: $75520000. Process Project1.exe (5356)
Module Load: pshook.dll. No Debug Info. Base Address: $669C0000. Process Project1.exe (5356)
Module Load: imagehlp.dll. No Debug Info. Base Address: $754A0000. Process Project1.exe (5356)
Thread Start: Thread ID: 4276. Process Project1.exe (5356)
Thread Start: Thread ID: 92. Process Project1.exe (5356)
Thread Start: Thread ID: 3596. Process Project1.exe (5356)
Thread Start: Thread ID: 4332. Process Project1.exe (5356)
Thread Start: Thread ID: 1716. Process Project1.exe (5356)
Thread Start: Thread ID: 4432. Process Project1.exe (5356)
Thread Start: Thread ID: 3124. Process Project1.exe (5356)
Thread Start: Thread ID: 6928. Process Project1.exe (5356)
Thread Start: Thread ID: 5868. Process Project1.exe (5356)
Thread Start: Thread ID: 6672. Process Project1.exe (5356)
Thread Start: Thread ID: 4320. Process Project1.exe (5356)
Thread Start: Thread ID: 4792. Process Project1.exe (5356)
Thread Start: Thread ID: 5260. Process Project1.exe (5356)
Module Load: MSWSOCK.dll. No Debug Info. Base Address: $734A0000. Process Project1.exe (5356)
Thread Start: Thread ID: 4088. Process Project1.exe (5356)
Thread Start: Thread ID: 3092. Process Project1.exe (5356)
Thread Start: Thread ID: 7004. Process Project1.exe (5356)
Thread Start: Thread ID: 6660. Process Project1.exe (5356)
Thread Start: Thread ID: 1404. Process Project1.exe (5356)
Module Load: DNSAPI.dll. No Debug Info. Base Address: $74A60000. Process Project1.exe (5356)
Thread Start: Thread ID: 2696. Process Project1.exe (5356)
Thread Start: Thread ID: 5804. Process Project1.exe (5356)
Module Load: IPHLPAPI.DLL. No Debug Info. Base Address: $74B70000. Process Project1.exe (5356)
Module Load: WINNSI.DLL. No Debug Info. Base Address: $74A50000. Process Project1.exe (5356)
Module Load: rasadhlp.dll. No Debug Info. Base Address: $72930000. Process Project1.exe (5356)
Thread Exit: Thread ID: 4332. Process Project1.exe (5356)
Thread Exit: Thread ID: 5260. Process Project1.exe (5356)
Thread Exit: Thread ID: 7004. Process Project1.exe (5356)
Thread Exit: Thread ID: 5868. Process Project1.exe (5356)
Thread Exit: Thread ID: 6660. Process Project1.exe (5356)
Thread Exit: Thread ID: 4276. Process Project1.exe (5356)
Thread Exit: Thread ID: 92. Process Project1.exe (5356)
Thread Exit: Thread ID: 2696. Process Project1.exe (5356)
Thread Exit: Thread ID: 6672. Process Project1.exe (5356)
Thread Exit: Thread ID: 4792. Process Project1.exe (5356)
Thread Exit: Thread ID: 5804. Process Project1.exe (5356)
Thread Exit: Thread ID: 4088. Process Project1.exe (5356)
Thread Exit: Thread ID: 1404. Process Project1.exe (5356)
Thread Exit: Thread ID: 3092. Process Project1.exe (5356)
Thread Exit: Thread ID: 4432. Process Project1.exe (5356)
Thread Exit: Thread ID: 3124. Process Project1.exe (5356)
Thread Exit: Thread ID: 4320. Process Project1.exe (5356)
Thread Exit: Thread ID: 1716. Process Project1.exe (5356)
Thread Start: Thread ID: 5792. Process Project1.exe (5356)


PM MAIL   Вверх
PointerToNil
Дата 14.4.2014, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



UKRtortik, проверил свою ссылку - не работает, весь сайт накрылся - а вы что молчите?? вот, держите копию:
http://webcache.googleusercontent.com/sear...oka-delphi.html

а для начала я бы тупо закомментировал строку с synchronize и посмотрел бы на быстродействие

Рoseidon> С Synchronize запись в Memo делается двумя строчками кода. 

точно. на этом все и ловятся

Рoseidon> При любом раскладе, даже с помощью PostMessage, мы передаем управление в VCL-поток для отрисовки Memo. 

НЕТ же! асинхронное сообщение передаёт данные, а не управление. как и переменные.
передать управление из потока в поток вообще невозможно, хотя можно организовать видимость этого, тупо приостановив "вызывающий" поток до завершения действия в "вызываемом", что и делает synchronize

Рoseidon> Ну а общение через переменные - это вообще аут. А как эти переменные в VCL-потоке считывать? Цикл крутить? 

не "аут", а банальное низкоуровневое решение
вы наверное удивитесь, но окно принимает/обрабатывает сообщения тоже крутя цикл
согласен, что подобный низкоуровневый код лучше куда-то заинкапсулировать, но раз борланд не справился...
можно юзать OmniThreadLibrary или AsyncCalls еще

Рoseidon> таймер использовать?

проще sleep, хотя я бы предпочел CreateEvent и WaitForSingleObject

так уж вышло, что "из коробки" synchronize оказался единственным удобным средством для передачи сообщений VCL-потоку
но эта штука специфичная. гораздо полезнее во многих случаях был бы "Asynchronize" - то есть то же самое, но без приостановки потока (т. е. без удара по быстродействию)
вот тут недавно чел пострадал от synchronize: http://forum.vingrad.ru/index.php?showtopi...t&p=2604306

Это сообщение отредактировал(а) PointerToNil - 14.4.2014, 22:15
PM MAIL   Вверх
Poseidon
Дата 14.4.2014, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(UKRtortik @  14.4.2014,  21:12 Найти цитируемый пост)
а что не так в 17 строке? 
Вот, изучай.

Цитата(PointerToNil @  14.4.2014,  21:44 Найти цитируемый пост)
согласен, что подобный низкоуровневый код лучше куда-то заинкапсулировать, но раз борланд не справился...
можно юзать OmniThreadLibrary или AsyncCalls еще
 
Цитата(PointerToNil @  14.4.2014,  21:44 Найти цитируемый пост)
проще sleep, хотя я бы предпочел CreateEvent и WaitForSingleObject

По твоему подобные решения лучше Synchronize? Может вообще тогда на ассамблере писать, чо уж там?


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
PointerToNil
Дата 14.4.2014, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



Poseidon> По твоему подобные решения лучше Synchronize?

возможно, лучшее решение - Asynchronize, но его пока нет (и мне не нужно, а то мог бы попробовать набросать)

врожденный порок (для кого-то - фича) synchronize никуда не денется: он тупо останавливает вызывающий поток! кому это нужно? мне нет, поэтому любое решение, этого не делающее - для меня лучше

Poseidon> Может вообще тогда на ассамблере писать, чо уж там?

если речь о функции-утилите, которая пишется 1 раз, а используется в тысяче мест - то многие так и делают (в применении к потокам - смысла в ассемблере нет)

Это сообщение отредактировал(а) PointerToNil - 14.4.2014, 23:08
PM MAIL   Вверх
Poseidon
Дата 15.4.2014, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(PointerToNil @  14.4.2014,  23:03 Найти цитируемый пост)
он тупо останавливает вызывающий поток! кому это нужно?
Это дает гарантию, что к общему ресурсу (в частности к VCL-объекту) имеет доступ только один поток. Видимо PointerToNil не сталкивался с ситуациями, когда пока один поток перепрыгнет на одну строку, второй поток уже считает данные и изменит их. Synchronize для того и задуман, что бы гарантировать доступ только одного потока. Если у нас ситуация, когда один поток должен работать с данными, которые высчитываются в другом потоке, то как можно гарантировать правильность расчетов?


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
PointerToNil
Дата 15.4.2014, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



Poseidon, у меня просто слов нет, чтобы выразить...
конечно, к VCL-объекту имеет доступ только один поток - поток VCL!!! не в вызывающем же потоке исполняется метод-параметр synchronize!
если возникли сомнения: http://forum.vingrad.ru/index.php?showtopi...st&p=480368
и подробнее: http://www.delphiplus.org/articles/delphi/...s_programs.html
вот только зачем вызывающий поток-то для этого останавливать? 
это даже гарантию немедленного исполнения требуемого действия не может дать - поток VCL чем-то своим еще может быть занят
хотя на однопроцессорных и однотредовых машинах эта остановка еще имела смысл (ускорить запуск требуемого метода), но на многопроцессорных смысла уже не осталось
очевидно, это - реликт, оставшийся от старой эпохи (хотя скорее всего могли и тогда более правильно это сделать)

а вот и возможное решение (из второй ссылки):
По сравнению с Delphi 7 в классы потоков Delphi 2009 внесено много изменений. Прежде всего, в класс TThread добавлена группа перегруженных методов Queue, которые позволяют синхронизировать вызов методов с главным потоком в неблокирующем режиме.

Poseidon> Видимо PointerToNil не сталкивался с ситуациями, когда пока один поток перепрыгнет на одну строку, второй поток уже считает данные и изменит их

конечно нет, как же это, совсем без критических секций что ли?? (а для простых типов данных, <=4 байта - есть interlocked* функции)

Poseidon>Если у нас ситуация, когда один поток должен работать с данными, которые высчитываются в другом потоке, то как можно гарантировать правильность расчетов?

ну как бы сразу напрашивается переменные/поля на 3 состояния, сигнализирующие о том, что обработка данной порции данных еще не начата/начата/уже закончена или 2 переменные - счетчики числа взятых на обработку элементов и числа уже обработанных (причем синхронизировать доступ к ним (interlocked*) нужно только для операции установки состояния "взято на обработку" или увеличения счетчика взятых на обработку, только между несколькими потоками-обработчиками и только в случае, если их несколько, а VCL-поток волен читать их в любой момент) - но для кого-то это может показаться слишком простым и низкоуровневым, [sarcasm] тут же без пары крутых специальных классов с дюжиной методов не обойтись [/sarcasm] 
не любите циклы с ожиданием? используйте CreateEvent, (Re)SetEvent и WaitFor(Single|Multiple)Object

Это сообщение отредактировал(а) PointerToNil - 15.4.2014, 03:23
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0908 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.