Межплатформенная поточная обработка и GTK#, не работая (правильно)?

continue это не прыжок, который вы можете использовать, чтобы пойти куда угодно. Это просто переместит выполнение кода в начало цикла , который вы пометили.

Метки используются только для маркировки циклов , которые вы хотите продолжить или прервать позже. Не случайные строки кода, к которым вы хотите перейти. Так что да, ваша метка jmp1 полностью выходит за рамки

5
задан Matthew Scharley 3 February 2009 в 01:43
поделиться

4 ответа

Gtk + на Win32 правильно не поддерживает поточную обработку. Необходимо сделать все вызовы GUI от того же потока, как Вы сделали назвал Gtk. Основной ().

Это не на самом деле настолько плохо, как это звучит. Существует прием, который можно использовать для диспетчеризации функций основному потоку. Просто используйте Бойкий. Неактивный. Добавьте () от любого потока, и функция будет вызвана вскоре в том же потоке, как основной цикл работает в. Просто не забудьте возвращать false в неактивной функции-обработчике, или это продолжит работать навсегда.

Если Вы следуете и используете вышеупомянутые методы, Вы не должны даже называть Gdk. Потоки. Init () вообще.

8
ответ дан 13 December 2019 в 19:37
поделиться

Я не уверен, продолжает ли это работать Моно, но можно использовать класс Среды для определения, на котором ОС работает программа.

public static void Main (string[] args)
{
    PlatformID platform = Environment.OSVersion.Platform;
    if (platform == PlatformID.Win32NT ||
        platform == PlatformID.Win32S ||
        platform == PlatformID.Win32Windows)
        Glib.Thread.Init();
    else if (platform != PlatformID.Unix)
        throw new NotSupportedException("The program is not supported on this platform");

    Gdk.Threads.Init();
    // etc...

Перечисление PlatformID содержит больше, чем просто Windows и Unix однако, таким образом, необходимо проверить на другие значения.

2
ответ дан 13 December 2019 в 19:37
поделиться

Umm, Вы попытались украсить свой Основной метод [STAThread] атрибут?

например.

#if !Mono //or whatever  
[STAThread]  
#endif  
public static void Main (string[] args)  
{  
    Gdk.Threads.Init ();  
    ...  
}  

Сбой этого Вы могли использовать условную компиляцию как так...

public static void Main (string[] args)  
{  
    Gdk.Threads.Init ();  
#if !Mono //or whatever  
    Gdk.Threads.Init ();  
#endif
    ...  
}  
0
ответ дан 13 December 2019 в 19:37
поделиться

На самом деле это могло бы быть ошибкой или в привязке C# для GDK или в Вашей версии GDK. Согласно документации для gdk\_threads\_init(), g\_thread\_init() должен быть назван первым, и в документации GTK# говорится то же:

GLib.Thread.Init() должен быть назван прежде Gdk.Threads.Init().

На моей машине Linux (с GDK 2.14.4), программа C, которая звонит gdk\_threads\_init() не звоня g\_thread\_init() печатает сообщение об ошибке и завершается с ошибкой. Вы удостоверились, что у Вас есть та же версия GDK и на Linux и на Windows, и что версия на Linux (если это отличается от версии Windows) также требует вызова к g\_thread\_init(), или если это - что-то, что было изменено между этими двумя версиями. Наконец, проверьте, что эта программа завершается с ошибкой:

#include <gdk/gdk.h>

int main(int argc, char **argv) {
    gdk_threads_init();

    return 0;
}

Скомпилируйте его с gcc -o test `pkg-config --cflags --libs gdk-2.0` test.c
(принятие Вы сохранили его как test.c.)

Если та программа завершается с ошибкой, это - ошибка в Вашей библиотеке GDK#.
Если это не делает, это - ошибка в Вашей версии GDK.

1
ответ дан 13 December 2019 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: