2014-11-16 2 views
0

В настоящее время у меня есть программа, которая меняет изображение в окне gtk. Когда мой код меняет изображение, изменение появляется на изображении, как только я фокусируюсь на окне (т.е. нажмите, измените размер и т. Д.). Я бы хотел, чтобы он обновлялся без необходимости фокусироваться на окне, потому что у меня есть входные данные пользователя в терминал при изменении изображения (например, классификация субимажей). Таким образом, нужно постоянно щелкнуть вперед и назад, это неприятность.C - GTK Обновление изображения без фокусировки пользователя

У меня есть обработчик окна, работающий в отдельной теме.

Вот мой код

static void* gtkStarter(void * a) { 
gtk_main(); 
    return NULL; 
} 

void PixelImage::show() { 
    gtk_widget_show_all(this->window); 
    pthread_create(&this->pp, NULL, gtkStarter, NULL); 
} 

void PixelImage::close() { 
    gtk_widget_hide(this->window); 
    gtk_main_quit(); 
    pthread_join(this->pp, NULL); 
} 

void PixelImage::refresh() { 
    gtk_widget_show(this->image); 
} 

Я попытался назвать:

gtk_widget_show 
gtk_widget_grab_focus 
gtk_widget_realize 

Вот как я называю обновления экрана Red RS (* this-> р); Merge mm;

PntPxlVector *ppv = this->p->mapReduce(pp, this->radius, 
             this->thick + this->radius, 
             rs, mm); // Gets points for drawing a circle 

for (PntPxlVector::iterator itr = ppv->begin(); 
    itr != ppv->end(); 
    itr++) { // Draws the circle and stores previous pixel values 
    Pixel tmp = this->pi->get(itr->first); 
    this->pi->set(itr->first, itr->second); 
    itr->second = tmp; 
} 

this->pi->refresh(); // Refresh for circle display 
feature f = this->prompt("Label? "); // Give a class label to the pixels in the circle 

for (PntPxlVector::iterator itr = ppv->begin(); 
    itr != ppv->end(); 
    itr++) { // Reset the pixels to their original colors 
    this->pi->set(itr->first, itr->second); 
} 
this->pi->refresh(); // Refresh for correct display 


delete ppv; // clean up memory 
return f; 
+0

Как вы называете 'refresh'? – KoKuToru

+0

Я отправил код, который вызывает функцию обновления. Кстати, это C++. Refresh вызывается в основном потоке, тогда как, как показано, main gtk запускается в отдельном потоке –

+0

Я думаю, что это может иметь какое-то отношение к потоку gtk_main(), который не работает, когда окно находится в фоновом режиме –

ответ

0

Я не знаю, о GTK изображения, но я лично использую gtk_widget_queue_draw(GtkWidget *widget) для обновления изображения в Каире, он должен работать для вашего дела, а также.

+0

Я пробовал это, он не работает. т.е. ничего не происходит. От чтения немного, это, по-видимому, потому, что я не использую каир или какую-либо поверхность. –

Смежные вопросы