Страниц: [1] 2
  Печать  
Автор Тема: Запуск не Photon'овского потока  (Прочитано 5403 раз)
Vishnya211
Участник
*
Offline Offline

Сообщений: 29


Просмотр профиля
« : Сентября 29, 2015, 01:00:18 pm »

Добрый день!
Есть программа, которая всю основную работу выполняет в потоке.
Написала небольшое приложение в PhAB, которое позволяет открывать и изменять некие исходные данные, и запускать эту программу.
Но именно на запуске основного кода все приложение виснет. Вызов потока сделала, как ответную реакцию на кнопку "Старт". Но чую, что что-то не то сделала. Подскажите, как правильно запускать поток в приложении.
Записан
Dark
Sr. Member
****
Offline Offline

Сообщений: 343


Просмотр профиля
« Ответ #1 : Сентября 29, 2015, 10:28:32 pm »

Сумбурно очень описали.

Есть программа, которая всю основную работу выполняет в потоке.

Хорошо, есть программа #1 с единственным потоком.

Написала небольшое приложение в PhAB, которое позволяет открывать и изменять некие исходные данные, и запускать эту программу.

Есть другая программа, также с одним потоком. Вторая программа в какой-то момент запускает первую. Как запускает: system(), exec*(), ...?

Но именно на запуске основного кода все приложение виснет.

А если в справку посмотреть по функции, которой запускаете другую программу - она точно возвращать управление должна?

Вызов потока сделала, как ответную реакцию на кнопку "Старт".

Откуда взялся второй поток, если у обеих программ по 1 потоку?
Записан
Vishnya211
Участник
*
Offline Offline

Сообщений: 29


Просмотр профиля
« Ответ #2 : Сентября 30, 2015, 07:39:48 am »

Вот моя предыдущая тема http://qnx.org.ru/forum/index.php?topic=8107.0
Там коротко описано, что за программа.
В графическом приложении сделала кнопку "старт", в ответной реакции которой прописала вызов нужного исполняемого файла через system ();
Запускается и работает нормально, но обратно уже не вернуться.
Записан
Dark
Sr. Member
****
Offline Offline

Сообщений: 343


Просмотр профиля
« Ответ #3 : Сентября 30, 2015, 10:46:58 am »

Запускается и работает нормально, но обратно уже не вернуться.

Что-то мне подсказывает, что второе сообщение в теме вы читали через строчку. Намекну конкретнее: в справке есть пример использования system(), попробуйте отдельно с ним поиграться и все-таки почитать что там пишут.
« Последнее редактирование: Сентября 30, 2015, 10:49:13 am от Dark » Записан
Vishnya211
Участник
*
Offline Offline

Сообщений: 29


Просмотр профиля
« Ответ #4 : Сентября 30, 2015, 01:57:11 pm »

Намекну конкретнее: в справке есть пример использования system(), попробуйте отдельно с ним поиграться и все-таки почитать что там пишут.
Smiley
Справка привела меня к функции spawnl с флагом P_NOWAIT, и все получилось )
Не знаю пока, красивое это решение или нет.
Dark, cпасибо большое!
Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 167



Просмотр профиля
« Ответ #5 : Октября 02, 2015, 08:52:18 pm »

Ну, поток можно и так запустить:

Код:
//----------------------------------------------------------------------------------------------------
//поток управления
//----------------------------------------------------------------------------------------------------
void *Control_thread(void *data)
{
 //в многопоточных приложениях сигналы получают все потоки
 //если у потока нет обработчика, то поток завершается
 //поэтому блокируем любые сигналы для потока
 sigblock(255);
 //выполняем поток
 ThreadCtl(_NTO_TCTL_IO,NULL);
 
 while(1)
 {
  //выполняем что-то и проверяем флаг для завершения потока,
  //не забывая, что процессор нельзя занимать на 100% (delay(1) спасёт от этого, например) :)
 }
 return(NULL);
}


 thread_t pthread_ID;

 //запускаем поток
 pthread_attr_t pt_attr;
 pthread_attr_init(&pt_attr);
 pthread_attr_setdetachstate(&pt_attr,PTHREAD_CREATE_DETACHED);
 pthread_attr_setinheritsched(&pt_attr,PTHREAD_EXPLICIT_SCHED);
 pthread_attr_setschedpolicy(&pt_attr,SCHED_RR);
 pt_attr.param.sched_priority=CONTROL_THREAD_PRIORITY;
 pthread_create(&pthread_ID,&pt_attr,Control_thread,0);//создаём поток

 ...
 ...
 ...
 //завершаем поток, выставив ему какой-либо флаг для завершения (и не забывая использовать мьютексы)
 pthread_join(pthread_ID,NULL);//;ждём завершения потока  

« Последнее редактирование: Октября 02, 2015, 08:56:16 pm от da-nie » Записан

И день и ночь в пути
Dark
Sr. Member
****
Offline Offline

Сообщений: 343


Просмотр профиля
« Ответ #6 : Октября 03, 2015, 02:21:39 am »

//в многопоточных приложениях сигналы получают все потоки

Че, правда? Видать, POSIX нам врет.

"If the target is a thread, the signal is always delivered to exactly that thread. If the thread has the signal blocked — see SignalProcmask() — the signal remains pending on the thread.

If the target is a process, the signal is delivered to a thread that has the signal unblocked; see SignalProcmask(), SignalSuspend(), and SignalWaitinfo(). If multiple threads have the signal unblocked, only one thread is given the signal. Which thread receives the signal isn't deterministic.
"
Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 167



Просмотр профиля
« Ответ #7 : Октября 03, 2015, 09:46:12 am »

Нет, не врёт. Всё верно: "Which thread receives the signal isn't deterministic." - вот это и означает, что сигнал может получить любой поток. Таким образом, сигналы способны получить именно что все потоки.
Записан

И день и ночь в пути
Dark
Sr. Member
****
Offline Offline

Сообщений: 343


Просмотр профиля
« Ответ #8 : Октября 03, 2015, 07:02:19 pm »

может получить любой поток

не эквивалентно "сигналы получают все потоки". И уж тем более чушью является "если у потока нет обработчика, то поток завершается".
Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 167



Просмотр профиля
« Ответ #9 : Октября 03, 2015, 08:48:43 pm »

Эквивалентно - не эквивалентно, это уже как вам ваша фантазия подскажет. Wink
Писался этот комментарий в своё время не для вас и даже не для Vishnya211. Написан он у меня в тексте когда-то был для того, чтобы самому не забыть, зачем я sigblock(255) делаю.
Что касается фразы про завершение потока, то поток-таки завершается, если сигнал должен был вызывать завершение программы (в частности, SIGTERM). Поскольку такие сигналы посылаются чаще всего, то про их обработчик и написано. Другие сигналы я всё равно не обрабатываю.
Впрочем, в контексте вашего "не эквивалентно" во вполне корректной фразе, это будет не более чем повод  для очередного вашего наезда. Smiley Как дети, правда. Smiley

Если же вы хотели поделиться информацией о работе сигналов в потоках, вам стоило бы об этом явно написать, а не комментировать в стиле "Чё?", "Чушь!" и подобное. Wink А уж приводить кусок на английском (ведь есть аналоги на русском) вообще не стоило бы - с чего вы вдруг решили, что, я, например,хорошо знаю английский (не знаю - я учил немецкий)?
« Последнее редактирование: Октября 03, 2015, 09:08:50 pm от da-nie » Записан

И день и ночь в пути
Dark
Sr. Member
****
Offline Offline

Сообщений: 343


Просмотр профиля
« Ответ #10 : Октября 04, 2015, 02:34:08 am »

Если же вы хотели поделиться информацией о работе сигналов в потоках, вам стоило бы об этом явно написать

Выше указана наиявнейшая ссылка на соответствующий раздел официальной документации.

А уж приводить кусок на английском (ведь есть аналоги на русском)

С этого и нужно было начинать. Раз уж заикнулись, делитесь ссылкой на русифицированную справку по API QNX. Думаю, здесь многие будут благодарны.

Писался этот комментарий в своё время не для вас и даже не для Vishnya211. Написан он у меня в тексте когда-то был для того, чтобы самому не забыть
...
во вполне корректной фразе

Эту вполне корректную фразу прочитают потом любители готовых рецептов и будут потоки сигналами убивать. А следом пол форума зафлудят, мол, почему у них терминируется весь процесс. А раз комментарий по коду писался не для нас, то и нечего его было копи-пастить.
Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 167



Просмотр профиля
« Ответ #11 : Октября 04, 2015, 09:48:19 am »

Цитировать
Раз уж заикнулись, делитесь ссылкой на русифицированную справку по API QNX. Думаю, здесь многие будут благодарны.

У вас фантазия работает только в одну сторону - ту, которую вы для себя выбрали. Wink Разве речь шла о конкретном документе под названием "справка по API QNX"? Речь шла о том, что описание работы сигналов в POSIX есть на русском. Потому совершенно не обязательно имея родным русский язык приводить фрагменты на английском. Вы могли дать на английский фрагмент ссылку, могли процитировать после или перед описанием на русском. Спасибо, хоть переводчик Google это более-менее внятно перевёл. Wink А то стал бы я по словарям что ли лазать, выискивая что вы вообще процитировали?
Впрочем, написали вы, как я понимаю, в своём стиле: "Намекну конкретнее: в справке есть пример использования system(), попробуйте отдельно с ним поиграться и все-таки почитать что там пишут." Вместо того, чтобы написать конкретно, что вы имеете в виду и просто помочь сделать, вы играете в чеширского кота и "намекаете" с высоты своего знания.
Если вам уж так хочется самоутвердиться, попробуйте решить загадку вот какого рода: http://qnx.org.ru/forum/index.php?topic=7992.msg65264#msg65264 Я лично её пока что не решил и система всё так же длительно работать с тиком 0.1 мс и высокими приоритетами потоков не может. Впрочем, надо в 6.5 попробовать.

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

Как из исходника скопировал, так и скопировал. Wink А убивать потоки любители готовых рецептов не будут - они их вообще никогда самостоятельно не убивают.
Записан

И день и ночь в пути
Dark
Sr. Member
****
Offline Offline

Сообщений: 343


Просмотр профиля
« Ответ #12 : Октября 04, 2015, 10:47:00 am »

Речь шла о том, что описание работы сигналов в POSIX есть на русском.

Вот только нету описания того, как они работают в QNX. POSIX это только свод общих рекомендаций, не затрагивающих вопросы реализации. В общем, нет перевода, жаль: "пацан сказал, пацан не сделал".

Если вам уж так хочется самоутвердиться

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

решить загадку

Многие пытались побороть BSD стек и сделать из ethernet реал-тайм, да вот только никто так и не смог. Берете железку и пишете свою логику работы с сетью без стека,
(c) ваш К.О.
Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 167



Просмотр профиля
« Ответ #13 : Октября 04, 2015, 11:11:38 am »

Цитировать
Вот только нету описания того, как они работают в QNX.

А есть отличия?

Цитировать
POSIX это только свод общих рекомендаций, не затрагивающих вопросы реализации.

Вот есть у меня разные калькуляторы. Я знаю, что нажав "2" потом "+", потом "2" и нажав "=" я получу результат вычисления 2+2 (калькуляторы раннего этапа и программируемые мы не рассматриваем). Это "общая рекомендация" по работе кнопок. А вот реализация (как калькулятор это делает внутри) может быть различной.

Цитировать
...
В целом, если по существу сказать вам больше нечего, оставляю вас в одиночестве учиться вести аргументированную корректную беседу.

Я не буду аргументировать к "а кто первый начал", отвечать в стиле "сам дурак" и тому подобное, но, право, откуда у вас взялась обида на меня? Я всего лишь показал вам вас со стороны. Разве обезличены "чё", "чушь" и аналогичное? Вовсе нет. При обезличенном разговоре , если у вас есть данные, которые вы хотите сообщить - вы их просто сообщаете и всё тут - это с радостью примут, ещё и спасибо скажут - далеко не все помнят как что работает или работало даже в своём коде, ибо
Цитировать
Мне  пришлось  бы  быть  бочкой  памяти,  если  бы хотел я хранить все основания своих мнений. Уже и это слишком много для меня -  самому  хранить  свои мнения; и много птиц улетает уже. И среди них нахожу я и залетного зверька в моей голубятне, он мне чужой и дрожит, когда я кладу на него свою руку.

Цитировать
Многие пытались побороть BSD стек и сделать из ethernet реал-тайм

Не в реал-тайме дело. Чёрт с ним, с реал-таймом. Дело в возрастании нагрузки процессора со временем.

Цитировать
Берете железку и пишете свою логику работы с сетью без стека,

Пока к этому и идёт. Но это не лучший вариант из возможных. К тому же на волне импортозамещения появилась вероятность выкидывания ЕС1866 с QNX и применение ноутбука Эльбрус с его некой ОС, что повлечёт довольно большое переписывание программы под неизвестную систему...
« Последнее редактирование: Октября 04, 2015, 11:18:05 am от da-nie » Записан

И день и ночь в пути
Dark
Sr. Member
****
Offline Offline

Сообщений: 343


Просмотр профиля
« Ответ #14 : Октября 04, 2015, 12:39:12 pm »

А есть отличия?

А почему их не должно быть? На практике отличия встречаются.

Вот есть у меня разные калькуляторы. Я знаю, что нажав "2" потом "+", потом "2" и нажав "=" я получу результат вычисления 2+2 (калькуляторы раннего этапа и программируемые мы не рассматриваем). Это "общая рекомендация" по работе кнопок. А вот реализация (как калькулятор это делает внутри) может быть различной.

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

Простой пример из обсуждаемой предметной области. POSIX требует, чтобы процесс при определенных условиях при отправке не обрабатываемого сигнала терминировался. В QNX при клиент-серверном обмене если клиент с единственным потоком заблокирован сервером, то терминироваться он сможет только если сервер его разблокирует. Если он этого не пожелает, то клиентский поток не сможет терминироваться, при общем соответствии стандарту POSIX.

Разве обезличены "чё", "чушь"

Абсолютно. Эмоциональная окраска не отождествляется с конкретным лицом.

Дело в возрастании нагрузки процессора со временем.

Тогда и предложение разбираться в частной проблеме лишено смысла.

Пока к этому и идёт. Но это не лучший вариант из возможных. К тому же на волне импортозамещения появилась вероятность выкидывания ЕС1866 с QNX и применение ноутбука Эльбрус с его некой ОС, что повлечёт довольно большое переписывание программы под неизвестную систему...

А что мешает рассмотреть использование на этом ноутбуке также QNX?
Записан
Страниц: [1] 2
  Печать  
 
Перейти в: