Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2007, 16:29   #1
CyberMerlin
Пользователь
 
Аватар для CyberMerlin
 
Регистрация: 29.07.2007
Сообщений: 10
Печаль обработчики в кучу

народ, кто-н увязывал между собой несколько обработчиков (работающих независимо), которые работают и, соответственно, вносят изменения в одни и теже данные?

подскажите плиз как вы это реализовывали?
у меня все идеально работает НО только несколько минут, потом, по непонятной причине два потока конфликтуют, т.е. либо один никогда не просыпается, либо другому становитсо наплевать на работу в данный момент другого
CyberMerlin вне форума Ответить с цитированием
Старый 14.08.2007, 16:39   #2
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Ты сделай в потоках очередность. Первый закончил - посылает сообщение програмее. Есть кто-то в очереди - запускай. Все лаги уйдут сами собой.
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 14.08.2007, 16:57   #3
CyberMerlin
Пользователь
 
Аватар для CyberMerlin
 
Регистрация: 29.07.2007
Сообщений: 10
По умолчанию

ну я сделал таким образом, кроме потоков еще и критические секции подъюзал
вот описание примерное, как я сделал
подчеркиваю все работает ИДЕАЛЬНО НО только около нескольких минут.
----вот моя прога----
один поток (№1) у меня работает while 1=1 do, т.е. без завершения и готовит разные данные, собирает их в кучу и формирует запросы

второй поток (№2) создается программой и код выполняется в рамках критической секции, т.е. программа может создать за секунду несколько этих потоков
№2 удаляет данные сформированные потоком №1

я сделал так. как только создается №2 он проверяет работает ли сейчас №1 и ждет его завершения (тю точнее пока он дойдет до конца цикла, где стоит проверка создан ли №2) и как только №1 закончит свой труд, поток №2 усыпляет №1 пока сам не завершит свою работу -
- ТАКИМ образом я обеспечиваю целостность данных
в №2 эта проверка выглядит так
While Pack.Nt = 1 do SwitchToThread; // вот тут и наступает смерть (как я понимаю)
If Pack.Nt =1 then SuspendThread(number_1);
Pack.Nt :=10;
CyberMerlin вне форума Ответить с цитированием
Старый 14.08.2007, 17:01   #4
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Бесконечный цикл убирайте (3-й класс вторая четверть)
Такое переплетение которое используете убирайте
Смысла в том что вы написали не нашел, но если необходимо из одного потока "трогать" данные другого, то лучше симафор наверн все0- таки либо мультирид секции
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 14.08.2007, 17:09   #5
CyberMerlin
Пользователь
 
Аватар для CyberMerlin
 
Регистрация: 29.07.2007
Сообщений: 10
По умолчанию

мммм
у меня данные одни
array [] of packet
#1 эти данные формирует и отправляет в пункт назначения, который отправляет ответ о получении этих данных
поток #666 улавливает ответ и создает №2 поток, который и обрабатывает, что именно за данные получатель получил и соответствующим образом вносит изменения в массиве данных, а именно, либо удаляет соответствующий ПАКЕТ, чтобы его больше не отправляли, либо оповещает о непонятных данных
по окончании №2 ExitThread(0) и №1 продолжает свою работу.

поток №2 - процедура весь код которой - критическая секция EnterCriticalSection

2 Квэнди
если я правильно понял Вас, то вышеописанное получается уже реализовано ??
CyberMerlin вне форума Ответить с цитированием
Старый 14.08.2007, 17:17   #6
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Общих примеров в области многопоточности практически не бывает ( за исключением элементарных примеров) Каждый случай сугубо индивидуален и найти ошибку в чужой реализации (да и в своей тоже ) многопоточности одно из самых сложных направлений программирования
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 14.08.2007, 17:31   #7
CyberMerlin
Пользователь
 
Аватар для CyberMerlin
 
Регистрация: 29.07.2007
Сообщений: 10
По умолчанию

я так и понял, что это сложно
..посему и вопрос в массы выкинул
мож кто работал и знаком с подводными камнями некоторыми, которые можно было бы обойти
CyberMerlin вне форума Ответить с цитированием
Старый 14.08.2007, 17:35   #8
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Подводный камень в своем большинстве один это совместное использование ресурсов
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 15.08.2007, 11:07   #9
CyberMerlin
Пользователь
 
Аватар для CyberMerlin
 
Регистрация: 29.07.2007
Сообщений: 10
По умолчанию

квэнди
а можно немного сузить обсуждение? (у меня от воды голова начинает болеть)
общие ресурсы? только массив пакетов в который добавляются и удаляются пакеты согласно отправки и получения их получателем

могу что-н уточнить тут, если чего не так высказал или наоборот недосказал
нужна какая-н конкретика? может кусок кода какой выложить?
CyberMerlin вне форума Ответить с цитированием
Старый 15.08.2007, 12:08   #10
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
Восклицание

1. Не давай потокам пересекаться.
2. Как и подметил Квэнди, не создавай бесконечных циклов - поставь его по таймеру или после воспроизведения каких либо действий.
3. Не создавай второй поток, пока не убит первый. Т.к. потоки, выполняющие сборы, живут не более 10 сек (в среднем, и то при огромном объеме собираемых данных с выполнением огромного количества подфункций).
4. ОРГАНИЗУЙ автоматическое управление потоками в отдельном модуле, а еще лучше библиотекой. Которая будет рождать и убивать процессы в том порядке, в котором они заносятся в очередь.
5. Изменение данных при опросе ДОЛЖНО БЫТЬ НЕВОЗМОЖНЫМ, а если и возможным, то субъект должен хранить дамп всех его значений.

Чуть не забыл: Все переменные должны быть обязательно инициализированы и не перекрывать друг друга ни в коем случае!!! Все переменные типа PChar, P***, должны вызываться именно как указатели (приставка P означает Pointer), т.е. не так:
Код:
var S: String;
...
Function(PAnsiChar(S));

или

var S: PAnsiChar; // S: array[0..255] of char
...
Function(S);
а так:
Код:
var S: String;
...
Function(@S);
В принципе - общие положения взимодействия потоков, без поддержки многопоточности.
Познавая других, мы познаем себя.
С'est la vie...

Последний раз редактировалось SuperVisor; 15.08.2007 в 12:23.
SuperVisor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработчики добавления и удаления в дерево (TreeView) kayman Компоненты Delphi 10 08.03.2010 11:17
Перетасчить кучу файлов Nez Общие вопросы Delphi 4 20.03.2007 06:56