![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
-Сергей- |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 2.8.2003 Где: Россия Репутация: нет Всего: 1 |
Всем доброго дня! Вопрос в сабже. Пробовал на Delphi 7, XE5, XE10. В чем может быть проблема?
Или Synchronize не предназначен для использования в консоли?
Это сообщение отредактировал(а) -Сергей- - 3.3.2016, 07:35 --------------------
Для утвердительного ответа достаточно лишь одного слова - "да". Все прочие слова придуманы, чтобы сказать "нет". |
|||
|
||||
Doga |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 20.12.2007 Где: Россия, Обнинск Репутация: нет Всего: нет |
Привет.
С каким значением аргумента CreateSuspended создаётся поток? Execute хотя бы вызывается? А вообще, некоторое время назад, для вызова методов основного потока, у TThread появилась специальная версия Synchronize -StaticSynchronize. Однако в последних Rad Studio она уже успела устареть, т.к. обычная Synchronize сама стала статической (в XE8 - точно). Т.е. выбор корректного метода зависит от Вашего IDE. |
|||
|
||||
-Сергей- |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 2.8.2003 Где: Россия Репутация: нет Всего: 1 |
Doga, я же пример кода привел, там все ответы есть.
значит CreateSuspended = True Execute вызывается. Провел небольшое исследование и выяснил, что Execute висит на первом же попавшемся Synchronize. И дальше не выполняется. Можно изменить метод Execute и поставить бряк, например:
Прошелся отладчиком по модулям, и дошел в SysUtils до этого метода (Delphi XE10):
Что означает, Synchronize ждет какого-то сигнала от основного потока. А он его и не дождется, поскольку Timeout = INFINITE, а основной поток я завершил ExitThread(0); (если не завершить, то RTL вызовет ExitProcess) Это сообщение отредактировал(а) -Сергей- - 3.3.2016, 16:10 --------------------
Для утвердительного ответа достаточно лишь одного слова - "да". Все прочие слова придуманы, чтобы сказать "нет". |
||||||
|
|||||||
Doga |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 20.12.2007 Где: Россия, Обнинск Репутация: нет Всего: нет |
Есть подозрение, что некоторые из Ваших 10 потоков пытаюся получить одновременный доступ к методу основного потока TTestClass.UpdateCons.
Для отладки, создайте только 1 поток, посмотрите как работает он один. Возможно поможет StaticSynchronize, если она есть. |
|||
|
||||
-Сергей- |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 2.8.2003 Где: Россия Репутация: нет Всего: 1 |
Изначально у меня и был один. И с одним потоком такая же беда.
А насчет StaticSynchronize: [dcc32 Warning] Project1.dpr(37): W1000 Symbol 'StaticSynchronize' is deprecated: 'From C++ just use Synchronize now that it is just a static method' Только причем тут C++ ... Это сообщение отредактировал(а) -Сергей- - 3.3.2016, 20:07 --------------------
Для утвердительного ответа достаточно лишь одного слова - "да". Все прочие слова придуманы, чтобы сказать "нет". |
|||
|
||||
dnek |
|
|||
Новичок Профиль Группа: Участник Сообщений: 0 Регистрация: 1.4.2013 Репутация: нет Всего: нет |
В Вашем примере основной поток никогда не бывает свободным. Соответственно Synchronize никогда не сможет выполниться.
Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
-Сергей- |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 2.8.2003 Где: Россия Репутация: нет Всего: 1 |
dnek, если я не сделаю ExitThread(0), то приложение завершится, не дожидаясь завершения других потоков.
--------------------
Для утвердительного ответа достаточно лишь одного слова - "да". Все прочие слова придуманы, чтобы сказать "нет". |
|||
|
||||
dnek |
|
|||
Новичок Профиль Группа: Участник Сообщений: 0 Регистрация: 1.4.2013 Репутация: нет Всего: нет |
Естественно, но и Synchronize после этого перестанет работать. Вам надо искать другой способ вызова WriteToConsole. Используйте Event, SimpleEvent, семафор, мютекс, наконец простой флаг в связке с InterlockedIncrement/InterlockedDecremen/InterlockedExchange - т.е. какой-нибудь другой способ синхронизации потоков - и все у Вас будет ОК.
Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Synchronize можно спокойно использовать в консольном приложении, если понимать, что этот метод использует Event-ы. И основной поток должен проверять их состояние.
Видоизменим код так:
|
|||
|
||||
dnek |
|
||||
Новичок Профиль Группа: Участник Сообщений: 0 Регистрация: 1.4.2013 Репутация: нет Всего: нет |
Не "лучше было бы" а однозначно Interlocked~ или Atomic~
InterlockedCompareExchange или AtomicCmpExchange Этот ответ добавлен с нового Винграда - http://vingrad.com |
||||
|
|||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Про наличие этих функций я знаю. Но как применить их в контексте вышеприведенного кода? Не использовал их потому что весь эффект будет нивелирован в while. Было бы очень хорошо, если бы вы показали использование InterlockedCompareExchange в этом коде. |
|||
|
||||
dnek |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 0 Регистрация: 1.4.2013 Репутация: нет Всего: нет |
Вместо
использовать
Этот ответ добавлен с нового Винграда - http://vingrad.com |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |