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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В чем может быть ошибка при работе с Tchart 
:(
    Опции темы
asdnmg7sdkw
Дата 11.11.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Иногда в момент клика по Tchart'у выскакивает ошибка list index out of bounds(x), где x - число похожее на кол-во точек. Причем если применить zoom к небольшому кусочку, то ошибка при клике не появляется.Так же ошибка не появляется если процесс добавления и удаления точек остановлен. Debuger ссылается на строку Application.Run.
В чем может быть ошибка?
PM MAIL   Вверх
Alexeis
Дата 11.11.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



  Программа случаем не многопоточная? Какая делфя?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
asdnmg7sdkw
Дата 11.11.2007, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

 Программа случаем не многопоточная? Какая делфя? 

Дельфи7, многопоточная.
PM MAIL   Вверх
Alexeis
Дата 11.11.2007, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



  Вероятно что из второго потока происходит работа с Tchart без синхронизации.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
asdnmg7sdkw
Дата 11.11.2007, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Вероятно что из второго потока происходит работа с Tchart без синхронизации. 

Из 2-го потока через sendmessage скидываю на основной, а он уже работает с Tchart'ом. Вроде так можно.
PM MAIL   Вверх
Alexeis
Дата 12.11.2007, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



asdnmg7sdkw, смотря чего скидывать. Например, если скидывать адрес (указатель), то все равно будут проблемы, также как если скидывать строку, динамический массив, объект.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
asdnmg7sdkw
Дата 12.11.2007, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Alexeis @ 12.11.2007,  00:40)
asdnmg7sdkw, смотря чего скидывать. Например, если скидывать адрес (указатель), то все равно будут проблемы, также как если скидывать строку, динамический массив, объект.

Вообщем в неосновной поток поступают некоторые данные. Например x,y, название точки и некоторая информация о точке. Нужно записать эти данные в глобальный массив и нанести точку на чарт. Вот как это правильно сделать чтобы не возникали проблемы?
PM MAIL   Вверх
Alexeis
Дата 12.11.2007, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Запись в TChart делать в методе Synchronize второго потока.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
asdnmg7sdkw
Дата 12.11.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а как вызвать процедуру методом Synchronize и передать в нее параметры, если поток создан через BeginThread?
PM MAIL   Вверх
Alexeis
Дата 12.11.2007, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



http://forum.vingrad.ru/index.php?show_typ...howtopic=127140

В частности мое решение в предпоследнем посте.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
asdnmg7sdkw
Дата 12.11.2007, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Уточню немного задачу и ход решения. А вы поправьте, там где нужно smile
Задача.
Есть несколько дополнительных потоков и 1 основной. Каждый из дополнительных потоков получает информацию о точках и записывает в глобальный массив. У каждого доп. потока свой номер и соответственно своя ячейка в массиве. Нужно чтобы в чарт выводились точки определенного потока, а остальные просто сохранялись. Изначально выводятся точки 1-го доп. потока, впоследствии пользователь может выбрать другой поток.
Ход решения.
Сначало доп. поток записывает данные в свою ячейку в массиве. Входит в критическую секцию. Записывает номер ячейки в глобальную переменную, чтобы смог найти данные в другой процедуре. Потом запускает процедуру методом synchronize, в которой смотрит действительно ли он тот поток, который должен рисовать в чарте. Если да, то рисуем точки, выходим из процедуры и освобождаем секцию. Если нет то просто выходим. Вдруг пользователь изменил поток который выводит информацию, тогда изменяем значение глобальной переменной, которая означает какой поток должен наносить точки. Очищаем чарт и рисуем точки выбранного потока. Вот тут наверно тоже надо както синхронизировать основной поток с выбранным дополнительным.
PM MAIL   Вверх
Alexeis
Дата 12.11.2007, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(asdnmg7sdkw @  12.11.2007,  20:24 Найти цитируемый пост)
Записывает номер ячейки в глобальную переменную, чтобы смог найти данные в другой процедуре.

  Только эта переменная должна быть объявлена как ThreadVar, вместо var, чтобы для каждого потока создалась своя копия.
  
Цитата(asdnmg7sdkw @  12.11.2007,  20:24 Найти цитируемый пост)
Потом запускает процедуру методом synchronize, в которой смотрит действительно ли он тот поток, который должен рисовать в чарте. Если да, то рисуем точки, выходим из процедуры и освобождаем секцию. 

  Правильно.

Цитата(asdnmg7sdkw @  12.11.2007,  20:24 Найти цитируемый пост)
Вдруг пользователь изменил поток который выводит информацию, тогда изменяем значение глобальной переменной, которая означает какой поток должен наносить точки. Очищаем чарт и рисуем точки выбранного потока. Вот тут наверно тоже надо както синхронизировать основной поток с выбранным дополнительным. 


  Может просто все потоки зациклить, а после вывода точек усыплять, например на мьютексах, затем если значение номера потока изменить, то разбудить все потоки, сигнализировав всем мьютексам, каждый поток проверит и заснет, а поток чей номер записан передаст точки и тоже заснет, пока в очередной раз не изменят значение.
  Не нужно выходить из функции потока.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
dumb
Дата 12.11.2007, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



пуcть доп.потоки только заполняют данные, а отрисовкой лучше заниматься основному потоку.
вызывать Synchronize, находясь в крит.секции - дурно попахивает и тянет на потенциальный deadlock.
PM MAIL   Вверх
asdnmg7sdkw
Дата 12.11.2007, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Только эта переменная должна быть объявлена как ThreadVar, вместо var, чтобы для каждого потока создалась своя копия.

Вообще если будет критическая секция то только 1 поток в нее зайдет и соответственно только 1 поток будет ее использовать. Тогда зачем для каждого своя переменная?
Цитата

Может просто все потоки зациклить, а после вывода точек усыплять, например на мьютексах, затем если значение номера потока изменить, то разбудить все потоки, сигнализировав всем мьютексам, каждый поток проверит и заснет, а поток чей номер записан передаст точки и тоже заснет, пока в очередной раз не изменят значение.
  Не нужно выходить из функции потока. 

Что-то до меня не доходит эта идея. Хочу заметить, что дополнительные потоки зациклены. Они периодически добавляют и удаляют точки из массива и только 1 из них добавляет и удаляет их из чарта.
PM MAIL   Вверх
asdnmg7sdkw
Дата 15.11.2007, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я забыл 1 деталь. Еще доп. потоки будут перемещать свои точки.
Посмотрите плз что у меня получилось и скажите что сделано не так.

Это сообщение отредактировал(а) asdnmg7sdkw - 15.11.2007, 22:45

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  test_chart.rar 6,65 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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