LINUX.ORG.RU

Qt: QThread ?


0

0

Наверное туплю, но структура такая:

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

   MyBase MyBase1;

return a.exec();
}

class MyThread:public QThread{
public:

void run(){cout << «HELLO !!!!» << endl;}
}

MyBase1::MyBase1() {
MyThread mt;
............
mt.start();
............
}

Т.е. в конструкторе основного класса запускаю поток. Думаю, это как-то не
правильно, но приложение консольное, где еще запускать ?
Да, ну и поток не запускается почему-то ?




Последнее исправление: drZlo (всего исправлений: 1)
Ответ на: комментарий от Nastishka

> Правда, потом автор «того» кода будет долго гадать, overflow, underflow или division by zero у него случился после вашего багрепорта :-)

Если библиотека чужая, то делаем feenableexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW), ставим обработчик SIGFPE, анализируем флаги FPU/информацию об исключении, делаем abort() для получения core dump. Вполне достаточно инфы, чтобы отправить разработчику :-)

sjinks ★★★
()
Ответ на: комментарий от Devix

> Преобразование сигнала SIGFPE, SIGPIPE в исключение может иметь место

SIGPIPE в исключение проблемно преобразовать. С танцами с бубном и -fcall-exceptions можно поймать только SIGFPE/ILL/SEGV, возможно, SIGBUS. Да и извращаться со стеком ради такого... имхо, проще заигнорить SIGPIPE и проверить код ошибки после вызова соответствующей функции.

sjinks ★★★
()
Ответ на: комментарий от sjinks

Ну вот, и скатились опять к сигналам и умиранию по наличии сигнала вместо нормально обработки исключений :-)

Nastishka ★★★★★
()
Ответ на: комментарий от Nastishka

Зачем умирать? Просто игнорировать сигнал и проверять код возврата. И при необходимости кидать исключение. По-моему, неплохой подход.

sjinks ★★★
()
Ответ на: комментарий от Nastishka

> SIGTERM, когда программа находится в каком-нибудь ожидании?

Какая разница, асинхронные сигналы не предсказуемы и они могут возникнуть где попало.

Вот допустим я преобразовываю SIGTERM в исключение signal_term. Если исключение signal_term возникнет в указанных ниже местах то программа завершится:

// — Пример 1 --
class My
{
public:
~My()
{
//->может возникнуть здесь
try
{
clear();
}
catch (...)
{
//->может возникнуть здесь
}
//->может возникнуть здесь
}
}

void test_my()
{
My my;
throw 1;
}

// — Пример 2 --

void my_func() throw()
{
//->может возникнуть здесь
try
{
calc();
}
catch (...)
{
//->может возникнуть здесь
}
//->может возникнуть здесь
}

Как мне обезопасить программу от такого поведения? Как мне поймать исключение signal_term со 100% вероятностью не завершив программу?

Devix
()
Ответ на: комментарий от namezys

>кому вообще пришло в голову мешать сигналы и исключения?

ЗЫ: тред не читал


Ну тогда почитай и все глупые вопросы сами отпадут.

Devix
()
Ответ на: комментарий от namezys

> кому вообще пришло в голову мешать сигналы и исключения?

Задача - выкинуть exception по факту доступа туда, куда не надо. Способы решения предложите?

Nastishka ★★★★★
()
Ответ на: комментарий от namezys

Ну например работает у вас в программе несколько нитей. Но так вот получилось, что некоторые из них активно используют проприетарные библиотеки, которые подглючивают.

Nastishka ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.