![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Ablis |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 13.4.2011 Репутация: нет Всего: нет |
Всем доброго времени суток. Столкнулся с непонятной для себя проблемой.
В программе использую следующий поток:
И собственно процедуры в потоке:
AntiRootkitEngine - это большой класс по поиску скрытых процессов. Пока все было не в отдельном потоке, все прекрасно выводилось в StringGrid, но стоило код запихнуть в TThread, как после отработки потока, в таблицу выводится только строка на которой стоит фокус, хотя количество строк визуально изменяется, а также перестает работать выравнивание по ширине в столбцах. Под отладкой структура данных ProcessList корректно заполнена. Если заменить:
То в Memo все прекрасно отображается. Токда почему не выводится в таблицу? Помогите пожалуйста разобраться! |
||||||
|
|||||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Запомните раз и навсегда - нельзя к визуальным компонентам обращаться из дополнительного потока. Многопоточность - как это делается в Delphi |
|||
|
||||
| Ablis |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 13.4.2011 Репутация: нет Всего: нет |
Мммм, а Synchronize?
Стаью перечитаю. |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
И ошибок никаких не было? Не повезло что AV ни разу не возникло из-за for row:= 1 to Form1.StringGrid1.RowCount do Это сообщение отредактировал(а) northener - 14.8.2013, 13:52 -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| Ablis |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 13.4.2011 Репутация: нет Всего: нет |
Я его искуственно увеличил: Form1.StringGrid1.RowCount:= ProcessList.ItemCount+1; Поэтому могу себе позволить обращаться в цикле так |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| Ablis |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 13.4.2011 Репутация: нет Всего: нет |
Так я вроде к ней напрямую не обращаюсь.. Пробовал добавить и Repaint; и Refresh; - результат тотже. |
|||
|
||||
| Ablis |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 13.4.2011 Репутация: нет Всего: нет |
Перечитал статью. Оказывается я ее уже когда-то давно читал, но вроде на английском языке. Так я и использую Synchronize для обращения к VCL из потока, а более сложные варианты мне не нужны, грубо говоря, моя задача сделать программу отзывчивой к действиям пользователя во время длительной операции. Пользуюсь delphi xe4, а в нем потоки перетерпели многочисленные изменения, да и потокозащищенность тех же VCL возросла. |
|||
|
||||
| Illusion Dolphin |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Что-то мне кажется, что в любом случае, как бы вы не увеличивали у себя там что-то, всё равно
Сделает AV -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
||||
|
|||||
| Ablis |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 13.4.2011 Репутация: нет Всего: нет |
Благодарю, не углядел. Оказывается, без исключения, я могу вывести текст в любую ячейку, даже несуществующую Но исправление на RowCount-1 конечно же исправляет работу программы, но вот проблему с выводом в потоке никак не решает. |
||||
|
|||||
| Illusion Dolphin |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Что именно исправляет и что не исправляет? В студию код исправленный и картинку того, что не исправлено. Добавлено через 59 секунд
ну а это до поры до времени, потом будет падение программы, 100% -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
||||
|
|||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Ablis, метод, вызываемый через Synchronize - выполняется в контексте основного потока.
Соответственно, пока выполняется ShowResult - будет блокироваться приложение, в том числе и прорисовка грида. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Ablis |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 13.4.2011 Репутация: нет Всего: нет |
C чего Вы это решили? Метод, вызываемый через Synchronize выполняется от того потока от которого был запущен, но способен изменять VCL основного потока через блокировки. Но эти блокировки, не блокируют приложение, так как приложение остается отзывчивым к действиям пользователя. Блокируются лишь методы вывода, но никак не, например, канва. Да и то, те методы, которые не выполняются в процессе блокировки, ставятся в очередь. Для работы с ней, например есть CheckSynchronize вызов которой приводит к выполнению всех методов, находящихся в данный момент в очереди SyncList, и возвращению управления из всех методов Synchronize, вызванных вторичными потоками.
Пожалуйста:
Результат - http://s2.ipicture.ru/uploads/20130815/SlEU8K14.jpg Или, если я ставлю фокус в другую ячейку ПЕРЕД вызовом потока - http://s2.ipicture.ru/uploads/20130815/SXMfF13W.jpg Но тем не менее, когда я переписал код так:
Все заработало Так что намудрил я что-то с выводом в StringGrid прошлый раз. Illusion Dolphin, еще раз благодарю, за наставление на истинный путь. |
||||||||
|
|||||||||
| Ablis |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 13.4.2011 Репутация: нет Всего: нет |
И напоследок, полностью рабочий код:
Работает и очистка строк и выравнивание по нужным для меня столбцам. Спасибо всем откликнувшимся, тему можно закрывать. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |