случайные типы ошибок, возникающих случайным образом в приложении GTK # с использованием асинхронной службы SOAP - PullRequest
1 голос
/ 27 февраля 2012

Я разрабатываю приложение GTK #, используя сервис SOAP для получения данных.Ошибки возникают при получении элементов и помещении их в Gtk.ComboBox.

Видимые ошибки:

  • gmem.c: 170: не удалось выделить x байтов, после чего SIGTRAP / SIGSEV / что угодно
  • glibc обнаружен * / usr/ bin / mono: двойное освобождение или повреждение (fasttop): 0x00007f27100e85a0 * GDK: ОШИБКА: gdkregion-generic.c: 1110: miUnionNonO: утверждение не выполнено: (y1

Я также вижу их довольно часто:

  • (KvkManager: 11471): Pango-WARNING **: неверная строка UTF-8 передана pango_layout_set_text ()
  • (KvkManager: 11506): Gtk-WARNING **: gtktreemodel.c: 2114: неверная ссылка на строку, у прокси нет выдающихся ссылок на строки

Это основная часть моего кода:

using System;
using Gtk;
using KvkWsProxy;

public partial class MainWindow: Gtk.Window
{
    private KvkSoapServerService kvkProxy;
    private NodeStore productsStore;

    protected Gdk.PixbufAnimation loadingTrobber;

    public MainWindow (): base (Gtk.WindowType.Toplevel)
    {
        Build ();

        this.tabs.CurrentPage = 0;

        this.loadingTrobber = new Gdk.PixbufAnimation("ajax-loader.gif");

        this.productsStore = new Gtk.NodeStore(typeof(KvkManager.SimpleProductTreeNode));

        this.kvkProxy = new KvkSoapServerService();
        this.kvkProxy.getSimpleProductsCompleted += this.putProducts;
        this.kvkProxy.getCollectionsCompleted += this.putProductCollections;
        this.kvkProxy.getTypesCompleted += this.putProductTypes;

        this.productsList.NodeStore = productsStore;
        this.productsList.AppendColumn("Nummer", new Gtk.CellRendererText(), "text", 0);
        this.productsList.AppendColumn("Naam", new Gtk.CellRendererText(), "text", 1);
        this.productsList.AppendColumn("Prijs", new Gtk.CellRendererText(), "text", 2);
        this.productsList.ShowAll();

        this.getProductCollections();
        this.getProductTypes();
    }

    protected void OnDeleteEvent (object sender, DeleteEventArgs a)
    {
        Application.Quit ();
        a.RetVal = true;
    }

    protected void putProductCollections(object sender, getCollectionsCompletedEventArgs args)
    {       
        this.productCollectionsComboBox.Clear();

        CellRendererText cell = new CellRendererText();
        this.productCollectionsComboBox.PackStart(cell, false);
        this.productCollectionsComboBox.AddAttribute(cell, "markup", 1);

        ListStore store = new ListStore(typeof(int), typeof(string));
        this.productCollectionsComboBox.Model = store;
        store.AppendValues(-1, "<span font-style=\"italic\">alle collecties</span>");

        foreach(Product_ProductCollection collection in args.Result)
        {
            store.AppendValues(collection.id, collection.name);
        }

        this.productCollectionsComboBox.Active = 0;
        this.productCollectionsComboBox.Sensitive = true;
        this.getCollectionsAnimation.Visible = false;
    }

    protected void putProductTypes(object sender, getTypesCompletedEventArgs args)
    {
        ... like putProductCollections() ...
    }

    protected void OnSearchButtonClicked (object sender, System.EventArgs e)
    {
        this.productSearchButton.Sensitive = false;
        this.searchAnimation.PixbufAnimation = this.loadingTrobber;
        this.searchAnimation.Visible = true;

        productsStore.Clear();

        this.kvkProxy.getSimpleProductsAsync();
    }

    protected void putProducts(object sender, getSimpleProductsCompletedEventArgs args)
    {       
        foreach(Product_SimpleProduct product in args.Result)
        {
            productsStore.AddNode(new KvkManager.SimpleProductTreeNode(product));
        }

        this.productSearchButton.Sensitive = true;
        this.searchAnimation.Visible = false;
    }

    protected void getProductCollections()
    {
        this.productCollectionsComboBox.Sensitive = false;
        this.getCollectionsAnimation.PixbufAnimation = this.loadingTrobber;
        this.getCollectionsAnimation.Visible = true;

        this.kvkProxy.getCollectionsAsync();
    }

    protected void getProductTypes()
    {
        ... like putProductCollections() ...
    }

    protected void getProductSizegroups()
    {
        ... like putProductCollections() ...
    }

    protected void getProductBrands()
    {
        ... like putProductCollections() ...
    }
}

Вы можете загрузить весь проект на http://home.vdslikke.net:8090/~johan/KvkManager.zip.

Версии моего программного обеспечения:

  • MonoDevelop 2.8.1
  • Mono 2.10.5 (tarball Mon Sep 5 19:35:47 UTC 2011) (64-разрядная версия)
  • GTK 2.24.8 (GTK # 2.12.0.0)

Если есть какая-либо информацияormation Вы должны помочь мне с этой проблемой, пожалуйста, дайте мне знать.

Ответы [ 2 ]

1 голос
/ 03 января 2013

Я узнал, что я делаю неправильно здесь

Поток, который запускает цикл обработки событий, называется "собственным" Gtk. Это означает, что все операции Gtk должны выполняться из этого потока, а не из другого потока. Неспособность ограничить использование Gtk этим потоком приведет к непредсказуемому поведению и чаще всего приведет к падению.

После переноса всех операций с графическим интерфейсом в Gtk.Application.Invoke () я больше не получаю ошибок.

0 голосов
/ 02 марта 2012

Я решил проблему, не назначая модель до добавления всех элементов, например:

protected void putProductCollections(object sender, getCollectionsCompletedEventArgs args)
{       
    this.productCollectionsComboBox.Clear();

    CellRendererText cell = new CellRendererText();
    this.productCollectionsComboBox.PackStart(cell, false);
    this.productCollectionsComboBox.AddAttribute(cell, "markup", 1);

    ListStore store = new ListStore(typeof(int), typeof(string));
    store.AppendValues(-1, "<span font-style=\"italic\">alle collecties</span>");

    foreach(Product_ProductCollection collection in args.Result)
    {
        store.AppendValues(collection.id, collection.name);
    }
    this.productCollectionsComboBox.Model = store;

    this.productCollectionsComboBox.Active = 0;
    this.productCollectionsComboBox.Sensitive = true;
    this.getCollectionsAnimation.Visible = false;
}

Теперь время от времени у меня возникают проблемы с GTK, такие как неправильно нарисованные вкладки и невидимые анимации. Затем в консоли выводится следующее предупреждение:

(KvkManager: 13889): Gtk-CRITICAL **: IA__gtk_tree_row_reference_new: утверждение `GTK_IS_TREE_MODEL (модель) 'не выполнено

Есть идеи на этот счет?

...