nesco, поправьте, пожалуйста, в этом примере чтоб данные с системного потока и из нового потока (некоторые компоненты их плодят) переходили в защищенный поток, и уже там обрабатывались. Хочу этакую универсальную схемку получить, которую можно было бы применять для защиты важных данных, не заботясь о проблемах с менеджером памяти. Обычные потоки пока в этом деле дают сбои, как уже убедился не раз.
Этот топик читают: Гость
Ответов: 704
Рейтинг: 7
|
|||
карма: 0 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
Neo писал(а): поправьте, пожалуйста, в этом примере чтоб данные с системного потока и из нового потока (некоторые компоненты их плодят) переходили в защищенный потокТак вроде штатный пример такой есть, где тормозится главный поток |
|||
карма: 22 |
|
Ответов: 704
Рейтинг: 7
|
|||
Главный тормозит на работе с базами. Потом несколько потоков из базы обрабатывают результаты каждый в свое назначение. Приходится перед базой порождать новый поток чтоб освободить главный от долгой процедуры.
------------ Дoбавленo в 21.03: Штатный пример на что именно? |
|||
карма: 0 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
Neo писал(а): Штатный пример на что именно?На SafeMode. Но там, почему-то, нет торможения главного потока |
|||
карма: 22 |
|
Ответов: 704
Рейтинг: 7
|
|||
nesco, я посмотрел прилагающийся пример к Вашему MutexThread, и хочу использовать именно его. Но как перенести в него данные из другого потока или из системного? SafeMode в примере я использовал чтоб не произошло накладки между системным потоком и параллельным при одновременном поступлении данных. Или это неверно?
|
|||
карма: 0 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
Neo писал(а): Но как перенести в него данные из другого потока или из системного?Сделай общие данные, типа кучи, и заталкивай в них, че тебе надо Neo писал(а): SafeMode в примере я использовал чтоб не произошло накладки между системным потоком и параллельным при одновременном поступлении данных. Или это неверно?Почему неверно, все правильно, но можно же использовать и стандартную защиту -- onSyncExeс, эта событие обслуживается в очереди главного потока и с ним синхронизированно |
|||
карма: 22 |
|
Ответов: 704
Рейтинг: 7
|
|||
Но onSyncExeс и тормозит главный поток, разве нет?
Какие-такие общие данные? Можно подробнее? И как потом их защитить от одновременного доступа из разных потоков? ------------ Дoбавленo в 01.43: И куча - это интересно, но обычно она не нужна. Вот идет строка в системном потоке, потом она должна сложную обработку пройти в новом потоке, а после отдать результат обратно в системный или другой параллельный поток - как здесь использовать MutexThread, чтоб не было накладок данных? - об этом мой пример, об организации безопасного перехода данных из потоков. |
|||
карма: 0 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
Neo писал(а): Вот идет строка в системном потоке, потом она должна сложную обработку пройти в новом потокеНу так и поставь то, что будет буферизировать эту строку, а от каждого потока SafeMode к этому буферу, что гарантирует доступ только одного потока к этому буферу |
|||
карма: 22 |
|
Ответов: 704
Рейтинг: 7
|
|||
nesco писал(а): Ну так и поставь то, что будет буферизировать эту строку, а от каждого потока SafeMode к этому буферу, что гарантирует доступ только одного потока к этому буферуСейчас у меня так и реализовано, но есть проблемы с вылетами при круглосуточной работе программки. Небезызвестный менеджер памяти балуется с потоками. Потому и хочу перевести все на Ваш MutexThread, но как его правильно пользовать? У Вас в примере ведь там совсем без SafeMode, а доступ разграничивается. Я об этом Вашем примере: code_27001.txt |
|||
карма: 0 |
| ||
файлы: 1 | code_27001.txt [6.2KB] [155] |
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
Neo писал(а): в примере ведь там совсем без SafeMode, а доступ разграничиваетсяТе же самые SafeMode, только интегрированные в поток и в режиме Mode=Global (Mutex) |
|||
карма: 22 |
|
Ответов: 704
Рейтинг: 7
|
|||
Я смог смоделировать моя проблему! Вот она, вот она, проблема моей мечты!
При совмещении потоков (системный и параллельный) вылетает в зависон или "Приложение будет закрыто". Сейфмод на системный поток поставить нельзя - он вешает всю прогу из-за wait. Как можно запустить в безотказную эксплуатацию эту схемку? code_27030.txt ------------ Дoбавленo в 13.46: но это на обычном стеке LIFO, а если поставить расширенный компонент FIFO - проблема настает значительно раньше. |
|||
карма: 0 |
| ||
файлы: 1 | code_27030.txt [1.4KB] [186] |
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
У тебя проблема не в потоке, а в переполнении стека -- пишут в стек два потока, а читает только один. Посмотри на данные после стека, они должны быть равны значению до стека, а они меньше. Скорость читающего потока должно быть в разы больше суммарной скорости записывающих, для гарантированного чтения всего стека.
|
|||
карма: 22 |
|
Ответов: 704
Рейтинг: 7
|
|||
nesco, да, Вы правы. Что-то не выходит смоделировать проблему. В реальности у меня много меньше идет записи в стек... а нестабильность проявляется
|
|||
карма: 0 |
|
118