나는 명백하게하려고 노력할 것입니다. 몇 가지 단추와 QTextEdit가있는 Qt 응용 프로그램을 만듭니다. 다음으로 pthread를 만듭니다. MainWindow에 대한 포인터를 매개 변수로 제공하십시오. 이런 식으로 :pthread에서 QObject로 신호 보내기
MainWindow w;
pthread_create(&rThread,NULL,treat,&w);
치료는 스레드가 만들어 질 때 실행되는 기능입니다. 지금은을 myButton이라는 푸시 버튼이 있고, 나는 치료의 함수 내에서 다음과 같이 뭔가를해야만 할 경우 :
가void *treat(void *arg)
{
MainWindow *win = (MainWindow*)arg;
win->ui->myButton->setEnabled(false);
close(pthread_self());
}
그것은 잘 작동하고 myButton에 사용할 수 없게됩니다 내 응용 프로그램입니다. 나는이 같은 일을하지만 경우 :
void *treat(void *arg)
{
MainWindow *win = (MainWindow*arg;
win->ui->editText->setText("random string");
close(pthread_self());
}
다음과 같은 오류와 충돌합니다 내 응용 프로그램 :
QObject: Cannot create children for a parent that is in a different thread. (Parent is QTextDocument(0x23af2e0), parent's thread is QThread(0x209a290), current thread is QThread(0x7f7eec000af0) The program has unexpectedly finished.
내가 UI를 메인 스레드에 살고 있으며, 아마도에서 accesible하지 않습니다 알고있는 것처럼 쓰레드, 나는이 스레드에 대한 메인 윈도우의 포인터를 제공했다. 그런데 왜 버튼을 사용할 수 없게 작동합니까? 나 엄청 혼란스러워. QThread를 사용하는 이유는 선생님이하지 않기 때문입니다. 나는 pthreads를 사용해야합니다. pthread에서 editText로 변경을 어떻게 적용 할 수 있습니까? Ui가 "살아있다"는 경우 어떻게 pthread에서 다른 스레드로 신호를 보낼 수 있습니까? 선배 들께 감사드립니다.
고마워요. 그것은 트릭을했다. 2 일 동안이 문제에 대한 해결책을 찾지 못했습니다. QThreads.pinally 대신 pthreads를 사용하게하기 위해 선생님이 싫어. 내 말 잘 들어, 선생님! :) – Zan
@Zan :'QThread'는 삶을 좀 더 쉽게 만들어 주지만 pthreads와 똑같은 제약에 직면하게됩니다. 즉, 스레드로부터 안전하지 않은 메서드에 대한 * 직접 * 크로스 스레드 호출을 수행 할 수 없습니다 (별도로 명시하지 않는 한 * all * 메서드를 읽습니다). –