|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
14.08.2007, 16:29 | #1 |
Пользователь
Регистрация: 29.07.2007
Сообщений: 10
|
обработчики в кучу
народ, кто-н увязывал между собой несколько обработчиков (работающих независимо), которые работают и, соответственно, вносят изменения в одни и теже данные?
подскажите плиз как вы это реализовывали? у меня все идеально работает НО только несколько минут, потом, по непонятной причине два потока конфликтуют, т.е. либо один никогда не просыпается, либо другому становитсо наплевать на работу в данный момент другого |
14.08.2007, 16:39 | #2 |
Павел Сергеевич
Форумчанин
Регистрация: 05.11.2006
Сообщений: 665
|
Ты сделай в потоках очередность. Первый закончил - посылает сообщение програмее. Есть кто-то в очереди - запускай. Все лаги уйдут сами собой.
Познавая других, мы познаем себя.
С'est la vie... |
14.08.2007, 16:57 | #3 |
Пользователь
Регистрация: 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; |
14.08.2007, 17:01 | #4 |
Старожил
Регистрация: 13.12.2006
Сообщений: 3,859
|
Бесконечный цикл убирайте (3-й класс вторая четверть)
Такое переплетение которое используете убирайте Смысла в том что вы написали не нашел, но если необходимо из одного потока "трогать" данные другого, то лучше симафор наверн все0- таки либо мультирид секции
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи |
14.08.2007, 17:09 | #5 |
Пользователь
Регистрация: 29.07.2007
Сообщений: 10
|
мммм
у меня данные одни array [] of packet #1 эти данные формирует и отправляет в пункт назначения, который отправляет ответ о получении этих данных поток #666 улавливает ответ и создает №2 поток, который и обрабатывает, что именно за данные получатель получил и соответствующим образом вносит изменения в массиве данных, а именно, либо удаляет соответствующий ПАКЕТ, чтобы его больше не отправляли, либо оповещает о непонятных данных по окончании №2 ExitThread(0) и №1 продолжает свою работу. поток №2 - процедура весь код которой - критическая секция EnterCriticalSection 2 Квэнди если я правильно понял Вас, то вышеописанное получается уже реализовано ?? |
14.08.2007, 17:17 | #6 |
Старожил
Регистрация: 13.12.2006
Сообщений: 3,859
|
Общих примеров в области многопоточности практически не бывает ( за исключением элементарных примеров) Каждый случай сугубо индивидуален и найти ошибку в чужой реализации (да и в своей тоже ) многопоточности одно из самых сложных направлений программирования
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи |
14.08.2007, 17:31 | #7 |
Пользователь
Регистрация: 29.07.2007
Сообщений: 10
|
я так и понял, что это сложно
..посему и вопрос в массы выкинул мож кто работал и знаком с подводными камнями некоторыми, которые можно было бы обойти |
14.08.2007, 17:35 | #8 |
Старожил
Регистрация: 13.12.2006
Сообщений: 3,859
|
Подводный камень в своем большинстве один это совместное использование ресурсов
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи |
15.08.2007, 11:07 | #9 |
Пользователь
Регистрация: 29.07.2007
Сообщений: 10
|
квэнди
а можно немного сузить обсуждение? (у меня от воды голова начинает болеть) общие ресурсы? только массив пакетов в который добавляются и удаляются пакеты согласно отправки и получения их получателем могу что-н уточнить тут, если чего не так высказал или наоборот недосказал нужна какая-н конкретика? может кусок кода какой выложить? |
15.08.2007, 12:08 | #10 |
Павел Сергеевич
Форумчанин
Регистрация: 05.11.2006
Сообщений: 665
|
1. Не давай потокам пересекаться.
2. Как и подметил Квэнди, не создавай бесконечных циклов - поставь его по таймеру или после воспроизведения каких либо действий. 3. Не создавай второй поток, пока не убит первый. Т.к. потоки, выполняющие сборы, живут не более 10 сек (в среднем, и то при огромном объеме собираемых данных с выполнением огромного количества подфункций). 4. ОРГАНИЗУЙ автоматическое управление потоками в отдельном модуле, а еще лучше библиотекой. Которая будет рождать и убивать процессы в том порядке, в котором они заносятся в очередь. 5. Изменение данных при опросе ДОЛЖНО БЫТЬ НЕВОЗМОЖНЫМ, а если и возможным, то субъект должен хранить дамп всех его значений. Чуть не забыл: Все переменные должны быть обязательно инициализированы и не перекрывать друг друга ни в коем случае!!! Все переменные типа PChar, P***, должны вызываться именно как указатели (приставка P означает Pointer), т.е. не так: Код:
Код:
Познавая других, мы познаем себя.
С'est la vie... Последний раз редактировалось SuperVisor; 15.08.2007 в 12:23. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
обработчики добавления и удаления в дерево (TreeView) | kayman | Компоненты Delphi | 10 | 08.03.2010 11:17 |
Перетасчить кучу файлов | Nez | Общие вопросы Delphi | 4 | 20.03.2007 06:56 |