Многопоточность: C # программа, работающая на C dll - Не отвечает C # - PullRequest
1 голос
/ 23 сентября 2011

Я написал C dll, который выполняет две задачи:

1) Передать определенные сообщения программе C #

2) Выполнить интенсивное задание в другом потоке

Все это работает, но пользовательский интерфейс C # не отвечает, хотя C выполняет интенсивную задачу в другом потоке.

Я также представил функцию C, которая запускает интенсивную задачу для C #, что позволяет C # попытаться запустить эту функцию в другом потоке.

Несмотря ни на что, C # застревает, а программа C # перестает отвечать на запросы при выполнении интенсивной задачи.

Я забыл упомянуть, что я написал всю программу на C, и она работает без проблем, но я хотел бы написать библиотеку C # для использования в будущих проектах .NET.

[DllImport(@"C:\projects\math\randomout\Debug\randout.dll", CharSet = CharSet.Auto, EntryPoint = "task_ToggleTask")]
internal static extern bool task_ToggleTask();

__declspec( dllexport ) BOOL task_ToggleTask()
{
    if ( _threadStopped )
    {
        _threadStopped = FALSE;
        _t_TaskHandle = ( HANDLE )_beginthread( task_Calculate, 0, NULL );
        return TRUE;
    }
    else
    {
        _threadStopped = TRUE;
        CloseHandle( _t_TaskHandle );
        return FALSE;
    }
}

static void task_Calculate( void* params )
{

    while ( !_threadStopped )
    {

        WORD nextRestInterval = rand_GetBetween( 15, 50 );

        /*
            trivial math calculations here...
         */

        //next update is at a random interval > 0ms
        Sleep( nextRestInterval );

    }

    _endthread();

}

Ответы [ 2 ]

0 голосов
/ 24 сентября 2011

Я постараюсь дать общий ответ, поскольку вы не указали, какую технологию пользовательского интерфейса C # вы используете (WPF или Winforms), и не привели ни одного примера кода вашего пользовательского интерфейса:
Я думаю, что вы 'Лучше сохранить ваш C-код как простую служебную библиотеку, не пытаясь там выполнять какие-то многопоточности, и пусть C # -код управляет фоновым потоком.В .Net UI есть много методов работы с потоками, которые позволяют адаптировать пользовательский интерфейс при выполнении некоторых длительных задач в фоновом режиме, например: Backgroundworker, Dispatcher.Invoke, Control.Invoke и т. Д. (Взгляните на этот вопрос например).

0 голосов
/ 23 сентября 2011

Вам нужно уменьшить приоритет вашей темы.Я предполагаю, что это происходит с вашей системой, а не только с программой.Если это происходит в вашей программе, уверены ли вы, что в вашем основном потоке приложений больше ничего не происходит и что он фактически работает в отдельном потоке?

Попробуйте уменьшить приоритет потока - см. Программно ограничить ЦПИспользование потока, работающего внутри службы

...