![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| asdnmg7sdkw |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 17.8.2007 Репутация: нет Всего: нет |
Иногда в момент клика по Tchart'у выскакивает ошибка list index out of bounds(x), где x - число похожее на кол-во точек. Причем если применить zoom к небольшому кусочку, то ошибка при клике не появляется.Так же ошибка не появляется если процесс добавления и удаления точек остановлен. Debuger ссылается на строку Application.Run.
В чем может быть ошибка? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Программа случаем не многопоточная? Какая делфя?
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| asdnmg7sdkw |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 17.8.2007 Репутация: нет Всего: нет |
Дельфи7, многопоточная. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Вероятно что из второго потока происходит работа с Tchart без синхронизации.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| asdnmg7sdkw |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 17.8.2007 Репутация: нет Всего: нет |
Из 2-го потока через sendmessage скидываю на основной, а он уже работает с Tchart'ом. Вроде так можно. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
asdnmg7sdkw, смотря чего скидывать. Например, если скидывать адрес (указатель), то все равно будут проблемы, также как если скидывать строку, динамический массив, объект.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| asdnmg7sdkw |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 17.8.2007 Репутация: нет Всего: нет |
Вообщем в неосновной поток поступают некоторые данные. Например x,y, название точки и некоторая информация о точке. Нужно записать эти данные в глобальный массив и нанести точку на чарт. Вот как это правильно сделать чтобы не возникали проблемы? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Запись в TChart делать в методе Synchronize второго потока.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| asdnmg7sdkw |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 17.8.2007 Репутация: нет Всего: нет |
а как вызвать процедуру методом Synchronize и передать в нее параметры, если поток создан через BeginThread?
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
http://forum.vingrad.ru/index.php?show_typ...howtopic=127140
В частности мое решение в предпоследнем посте. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| asdnmg7sdkw |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 17.8.2007 Репутация: нет Всего: нет |
Уточню немного задачу и ход решения. А вы поправьте, там где нужно
Задача. Есть несколько дополнительных потоков и 1 основной. Каждый из дополнительных потоков получает информацию о точках и записывает в глобальный массив. У каждого доп. потока свой номер и соответственно своя ячейка в массиве. Нужно чтобы в чарт выводились точки определенного потока, а остальные просто сохранялись. Изначально выводятся точки 1-го доп. потока, впоследствии пользователь может выбрать другой поток. Ход решения. Сначало доп. поток записывает данные в свою ячейку в массиве. Входит в критическую секцию. Записывает номер ячейки в глобальную переменную, чтобы смог найти данные в другой процедуре. Потом запускает процедуру методом synchronize, в которой смотрит действительно ли он тот поток, который должен рисовать в чарте. Если да, то рисуем точки, выходим из процедуры и освобождаем секцию. Если нет то просто выходим. Вдруг пользователь изменил поток который выводит информацию, тогда изменяем значение глобальной переменной, которая означает какой поток должен наносить точки. Очищаем чарт и рисуем точки выбранного потока. Вот тут наверно тоже надо както синхронизировать основной поток с выбранным дополнительным. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Только эта переменная должна быть объявлена как ThreadVar, вместо var, чтобы для каждого потока создалась своя копия. Правильно. Может просто все потоки зациклить, а после вывода точек усыплять, например на мьютексах, затем если значение номера потока изменить, то разбудить все потоки, сигнализировав всем мьютексам, каждый поток проверит и заснет, а поток чей номер записан передаст точки и тоже заснет, пока в очередной раз не изменят значение. Не нужно выходить из функции потока. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 3 Всего: 158 |
пуcть доп.потоки только заполняют данные, а отрисовкой лучше заниматься основному потоку.
вызывать Synchronize, находясь в крит.секции - дурно попахивает и тянет на потенциальный deadlock. |
|||
|
||||
| asdnmg7sdkw |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 17.8.2007 Репутация: нет Всего: нет |
Вообще если будет критическая секция то только 1 поток в нее зайдет и соответственно только 1 поток будет ее использовать. Тогда зачем для каждого своя переменная?
Что-то до меня не доходит эта идея. Хочу заметить, что дополнительные потоки зациклены. Они периодически добавляют и удаляют точки из массива и только 1 из них добавляет и удаляет их из чарта. |
||||
|
|||||
| asdnmg7sdkw |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 17.8.2007 Репутация: нет Всего: нет |
Я забыл 1 деталь. Еще доп. потоки будут перемещать свои точки.
Посмотрите плз что у меня получилось и скажите что сделано не так. Это сообщение отредактировал(а) asdnmg7sdkw - 15.11.2007, 22:45 Присоединённый файл ( Кол-во скачиваний: 2 )
test_chart.rar 6,65 Kb |
|||
|
||||
![]()
|
| Правила форума "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. |