Господа, добрый день. Возникла одна проблема, которую не получается решить в силу отсутствия соответствующий познаний о Qt.
Есть примерно следующий код:
class DataProcessing : public QObject
{
Q_OBJECT
public:
void data(); //Получаем и сохраняем данные
void processing() {/*Обработка полученных данных*/}
private:
RemoteDate ds; //Класс для работы с сервером посредством QTcpSocket
char* buffer; //Буфер для данных сервера
}
void DataProcessing::data()
{
//Какой-то код
ds.getData(buffer); //Получаем данные от удаленного сервера
//Снова какой-то код
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
DataProcessing dp;
dp->data();
dp->processing();
return a.exec();
}
Суть в том, что необходимо получить данные от удаленного сервера. Класс RemoteData производит всю процедуру обмена сообщениями и получения нужных данных от сервера в функции getData(char*), используя для этого класс QTcpSocket. После того, как данные получены, их необходимо обработать функцией processing().
Но в данном виде функция обработки данных по факту может быть вызвана ещё до того, как будут получены все данные.
На StackOverflow находил возможное решение данный проблемы. В кратце решение выглядело так:
void DataProcessing::data()
{
//Какой-то код
QEventLoop qel;
QObject::connect(&dp, SIGNAL(proceed()), &qel, SLOT(quit()));
ds.getData(buffer); //Получаем данные от удаленного сервера
qel.exec();
//Снова какой-то код
}
1) Как правильно отложить функцию обработки данных до момента пока эти самые данные не будут получены полностью?
2) Создавая QEventLoop мы блокируем обработку других события только для объекта, где QEventLoop был создан? Или инкапсулируя этот объект в другой (Yobj), унаследованный от QObject, мы блокируем обработку событий и этого Yobj?
И к первому вопросу добавлю, что отправка сигнала, по которому непосредственно будет запускаться обработка данных после их получения невозможен - инициировать обработку данных должен пользователь класса.
PS. Класс DataProcessing будет включаться в другие классы. Здесь в main() он расположен сугубо для демонстрации.