Здравствуйте! Проблема при использовании GTK+ под Windows. Пожалуйста, помогите чайнику - подскажите, что я не учитываю.
Поскольку есть желание в будущем перейти на Linux, интерфейс программы пишется на GTK+ (остальное написано на с++ и всё вместе компилируется под Visual Studio 10). При запуске программы создаётся пара вычислительных потоков, потом при помощи GTK+ рисуется основное окно и управление передаётся gtk_main(). Поначалу отладочная информация вычислительных потоков выводилась в стандартную консоль Windows (всё работало стабильно), а потом захотелось вывести эти данные в основном окне (уменьшить количество окошек на экране). В результате в какой-нибудь момент работы программы выскакивает ошибка: «Нарушение прав доступа при чтении», или такая: «ОС Windows инициировала точку останова в <название программы>. Это может быть вызвано повреждением кучи и указывает на ошибку в …» (отключаю вывод данных в область вывода - всё работает стабильно).
Область вывода формируется вот так:
GtkWidget *textview_show( GtkWidget *box, char *tit, int len )
{
GtkWidget *list_view;
GtkTreeStore *store;
GtkTreeIter iter;
GtkCellRenderer *renderer;
GtkWidget* scroll;
GtkTreeViewColumn *column;
scroll = gtk_scrolled_window_new (NULL, NULL);
gtk_container_set_border_width (GTK_CONTAINER (scroll), 10);
gtk_box_pack_start (GTK_BOX (box), scroll, TRUE, TRUE, 0);
store = gtk_tree_store_new(1, G_TYPE_STRING);
gtk_tree_store_append (store, &iter,NULL);
gtk_tree_store_set (store, &iter, 0, win_to_utf_( "пам-па-бам", 256 ), -1);
list_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (list_view), TRUE);
gtk_container_add(GTK_CONTAINER(scroll), list_view);
renderer = gtk_cell_renderer_text_new ();
column = gtk_tree_view_column_new_with_attributes(win_to_utf_( "1", 256 ), renderer, "text", 0, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW (list_view), column);
gtk_widget_show_all(box);
FILE *f=fopen( BCVM_FILE_LOG, "w" );
fclose(f);
return (GtkWidget *)list_view;
}
GtkWidget *_GLOBAL_TEXT;
void wmain1( int argc, char **argv )
{
…
_GLOBAL_TEXT = textview_show( hbox[3], "", len );
…
}
Выдача информации в область вывода происходит вот так:
void GTKConsole( char *sOutput )
{
GtkTreeModel *model;
GtkTreeIter iter;
GtkAdjustment *vadj;
FILE *f;
static gint count=0;
static bool buzy=false;
while(buzy){;;};
buzy = true;
if(_GLOBAL_TEXT){
f=fopen( BCVM_FILE_LOG, "ab" );
fprintf( f, "%s", sOutput );
fclose(f);
model=gtk_tree_view_get_model ((GtkTreeView *)_GLOBAL_TEXT);
if(count>1000){
gtk_tree_store_clear(GTK_TREE_STORE (model));
count = 0;
}
count++;
gtk_tree_store_append (GTK_TREE_STORE (model), &iter, NULL);
gtk_tree_store_set (GTK_TREE_STORE (model), &iter, 0, win_to_utf_( sOutput, 256 ), -1);
vadj = gtk_scrollable_get_vadjustment ((GtkScrollable *)_GLOBAL_TEXT);
gtk_adjustment_set_value(vadj, gtk_adjustment_get_upper(vadj));
}
buzy = false;
}
Вызов этой функции:
{
…
// вывод в стандартную консоль
WriteConsole(hStdOutNew ,sOutput ,strlen(sOutput) ,NULL,NULL);
// вывод в область вывода в окне
GTKConsole( str );
…
}