Как сделать оболочку потока Qt

100
12

Я написал некоторый код библиотеки (на языке C), чтобы облегчить создание и запрос потоков, не зависящих от платформы. Вот пример API-интерфейса psuedo-кода для создания потока:

 result OS_createThread ( 
pointer to thread handle (set after thread is created),
stack size,
function to run,
pointer to parameters,
priority )

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

result OS_createThread ( 
// Windows implementation
map priority to Windows priority
// Use Win32 threading call
CreateThread(blah blah)

Я создал порты для потоков Win32, POSIX и некоторых RTOS, которые я использовал. Теперь мне нужно сделать это для среды Qt, и я немного в тупике. Во-первых, я новичок Qt, во-вторых, похоже, для этого потребуется объектно-ориентированный подход с использованием класса QThread.

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

Используя QThreads, нужно создавать новый объект QThread каждый раз, когда запрашивается новый поток? Имейте в виду, что вызывающий код не может иметь никакого Qt-специфического.

Любое руководство ценится!

спросил(а) 2011-10-28T20:53:00+04:00 8 лет, 11 месяцев назад
1
Решение
70

Чтобы создать QThread, вы должны реализовать класс, наследующий от QThread. Пример, взятый из документации QT

class MyThread : public QThread
{
public:
void run();
};

void MyThread::run()
{
QTcpSocket socket;
// connect QTcpSocket signals somewhere meaningful
...
socket.connectToHost(hostName, portNumber);
exec();
}

И скрытый в вашей реализации будет:

result OS_createThread ( 
pointer to thread handle (set after thread is created),
stack size,
function to run,
pointer to parameters,
priority )
{
MyThread *thread = new MyThread(size, function, parameters, prio);
thread->start();
return thread;
}

Таким образом, ваш метод интерфейса C создаст экземпляр такого класса для каждого запрашиваемого потока. Затем этот класс должен хранить все соответствующие данные, переданные из вашей функции в пределах своих переменных-членов. Выполняемая функция потока будет вызвана в методе run(). Поскольку вы, похоже, выполняете только методы C, я не вижу проблем с сохранением указателя на них в переменной класса (пожалуйста, поправьте меня, если я ошибаюсь, еще не пробовал;).

Однако на самом деле это немного сложнее, потому что кому-то придется освободить память, созданную для переменной thread. И это нелегко (из интерфейса C) возможно с моим примером. Поэтому вы можете подумать об использовании внутреннего класса менеджера или того, что обрабатывает созданные потоки и уничтожает их по мере необходимости. Однако, чтобы сделать квалифицированное выражение о том, как вы могли этого достичь, мне понадобится немного больше информации;)

ответил(а) 2011-10-28T21:05:00+04:00 8 лет, 11 месяцев назад
41

Если вызывающий код не зависит от Qt, почему вы хотите использовать или внедрять QThread?


Если ваша цель заключается в переносе QThread-s (на самом деле, в библиотеку QCore) в вашу странную операционную систему, я бы сначала подробно изучил, как они реализовали ее выше Pthreads (при условии, что вы уже знаете информацию о позиционирующих потоках уже).

ответил(а) 2011-10-28T20:58:00+04:00 8 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема