私はGUIを表示し、パイプからの入力を受け入れる小さなアプリケーションを作成するためにQtを使用しています。パイプを読み込むコールをブロックする
パイプが作成されていない場合(か、私は理解してそこには作家いない場合は、)、fopen
ブロックへの呼び出し、さらにはそれはたぶんshow()
関数の後に呼ばれています考えて、UIは表示されません。
UIを表示するにはどうすればfopen
とその関連コードを呼び出すことができますか?私は窓があらかじめスクリーンにある限り、fopen
ブロックするかどうか気にしない。
私はconnect(this, SIGNAL(window_loaded), this, SLOT(setupListener()));
のようなものを使用しようとしましたが、動作は変わりません。
ヒントありがとう!
main.cppに
#include <QApplication>
#include "metadataWindow.h"
#include <sys/time.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
metadataWindow window;
window.showFullScreen();
window.setupListener();
return app.exec();
}
metadataWindow.cpp
metadataWindow::metadataWindow(QWidget *parent) : QWidget(parent)
{
this->setupUI(); // not shown here, but just basic QLabel stuff
}
void metadataWindow::setupListener()
{
const char *metadata_file = "/tmp/my-pipe-file";
// vvvvv This here is blocking vvvvvv
FILE *fd = fopen(metadata_file, "r");
pipe = new QTextStream(fd);
streamReader = new QSocketNotifier(fileno(fd), QSocketNotifier::Read, qApp);
QObject::connect(streamReader, SIGNAL(activated(int)), this, SLOT(onData()));
streamReader->setEnabled(true);
}
ご清聴ありがとうございました。私は非ブロックモードで 'open()'を使って2番目のルートに行きました。その結果、 'onData()'の最初の呼び出しで 'QTextStream'パイプを初期化しました(' 'FILE * open() 'を直接実行します)。これは実際にうまく動作している、私はそれが何か欠点を持つとは思わない.. – tchap