Вверх ↑
Этот топик читают: Гость
Ответов: 704
Рейтинг: 7
#106: 2012-02-24 17:10:00 ЛС | профиль | цитата
nesco, поправьте, пожалуйста, в этом примере чтоб данные с системного потока и из нового потока (некоторые компоненты их плодят) переходили в защищенный поток, и уже там обрабатывались. Хочу этакую универсальную схемку получить, которую можно было бы применять для защиты важных данных, не заботясь о проблемах с менеджером памяти. Обычные потоки пока в этом деле дают сбои, как уже убедился не раз.
карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#107: 2012-02-24 17:28:35 ЛС | профиль | цитата
Neo писал(а):
поправьте, пожалуйста, в этом примере чтоб данные с системного потока и из нового потока (некоторые компоненты их плодят) переходили в защищенный поток

Так вроде штатный пример такой есть, где тормозится главный поток
карма: 22

0
Ответов: 704
Рейтинг: 7
#108: 2012-02-24 21:03:04 ЛС | профиль | цитата
Главный тормозит на работе с базами. Потом несколько потоков из базы обрабатывают результаты каждый в свое назначение. Приходится перед базой порождать новый поток чтоб освободить главный от долгой процедуры.
------------ Дoбавленo в 21.03:
Штатный пример на что именно?
карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#109: 2012-02-24 22:44:17 ЛС | профиль | цитата
Neo писал(а):
Штатный пример на что именно?

На SafeMode. Но там, почему-то, нет торможения главного потока
карма: 22

0
Ответов: 704
Рейтинг: 7
#110: 2012-02-24 23:02:11 ЛС | профиль | цитата
nesco, я посмотрел прилагающийся пример к Вашему MutexThread, и хочу использовать именно его. Но как перенести в него данные из другого потока или из системного? SafeMode в примере я использовал чтоб не произошло накладки между системным потоком и параллельным при одновременном поступлении данных. Или это неверно?
карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#111: 2012-02-24 23:12:21 ЛС | профиль | цитата
Neo писал(а):
Но как перенести в него данные из другого потока или из системного?

Сделай общие данные, типа кучи, и заталкивай в них, че тебе надо
Neo писал(а):
SafeMode в примере я использовал чтоб не произошло накладки между системным потоком и параллельным при одновременном поступлении данных. Или это неверно?

Почему неверно, все правильно, но можно же использовать и стандартную защиту -- onSyncExeс, эта событие обслуживается в очереди главного потока и с ним синхронизированно
карма: 22

0
Ответов: 704
Рейтинг: 7
#112: 2012-02-25 01:43:03 ЛС | профиль | цитата
Но onSyncExeс и тормозит главный поток, разве нет?
Какие-такие общие данные? Можно подробнее? И как потом их защитить от одновременного доступа из разных потоков?
------------ Дoбавленo в 01.43:
И куча - это интересно, но обычно она не нужна. Вот идет строка в системном потоке, потом она должна сложную обработку пройти в новом потоке, а после отдать результат обратно в системный или другой параллельный поток - как здесь использовать MutexThread, чтоб не было накладок данных? - об этом мой пример, об организации безопасного перехода данных из потоков.
карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#113: 2012-02-25 03:19:15 ЛС | профиль | цитата
Neo писал(а):
Вот идет строка в системном потоке, потом она должна сложную обработку пройти в новом потоке

Ну так и поставь то, что будет буферизировать эту строку, а от каждого потока SafeMode к этому буферу, что гарантирует доступ только одного потока к этому буферу
карма: 22

0
Ответов: 704
Рейтинг: 7
#114: 2012-02-25 11:40:29 ЛС | профиль | цитата
nesco писал(а):
Ну так и поставь то, что будет буферизировать эту строку, а от каждого потока SafeMode к этому буферу, что гарантирует доступ только одного потока к этому буферу

Сейчас у меня так и реализовано, но есть проблемы с вылетами при круглосуточной работе программки. Небезызвестный менеджер памяти балуется с потоками. Потому и хочу перевести все на Ваш MutexThread, но как его правильно пользовать? У Вас в примере ведь там совсем без SafeMode, а доступ разграничивается.
Я об этом Вашем примере:
code_27001.txt
карма: 0

0
файлы: 1code_27001.txt [6.2KB] [155]
Разработчик
Ответов: 26170
Рейтинг: 2127
#115: 2012-02-25 14:30:15 ЛС | профиль | цитата
Neo писал(а):
в примере ведь там совсем без SafeMode, а доступ разграничивается

Те же самые SafeMode, только интегрированные в поток и в режиме Mode=Global (Mutex)
карма: 22

0
Ответов: 704
Рейтинг: 7
#116: 2012-02-27 13:46:14 ЛС | профиль | цитата
Я смог смоделировать моя проблему! Вот она, вот она, проблема моей мечты!
При совмещении потоков (системный и параллельный) вылетает в зависон или "Приложение будет закрыто". Сейфмод на системный поток поставить нельзя - он вешает всю прогу из-за wait. Как можно запустить в безотказную эксплуатацию эту схемку?

code_27030.txt
------------ Дoбавленo в 13.46:
но это на обычном стеке LIFO, а если поставить расширенный компонент FIFO - проблема настает значительно раньше.
карма: 0

0
файлы: 1code_27030.txt [1.4KB] [186]
Разработчик
Ответов: 26170
Рейтинг: 2127
#117: 2012-02-27 14:09:01 ЛС | профиль | цитата
У тебя проблема не в потоке, а в переполнении стека -- пишут в стек два потока, а читает только один. Посмотри на данные после стека, они должны быть равны значению до стека, а они меньше. Скорость читающего потока должно быть в разы больше суммарной скорости записывающих, для гарантированного чтения всего стека.
карма: 22

0
Ответов: 704
Рейтинг: 7
#118: 2012-02-27 18:58:08 ЛС | профиль | цитата
nesco, да, Вы правы. Что-то не выходит смоделировать проблему. В реальности у меня много меньше идет записи в стек... а нестабильность проявляется
карма: 0

0
118
Сообщение
...
Прикрепленные файлы
(файлы не залиты)