1

2 つのタスクを実行する C dll を作成しました。

1) 特定のメッセージを C# プログラムに中継する

2) 別のスレッドで集中的なタスクを実行する

すべて機能しますが、C が別のスレッドで集中的なタスクを実行しているにもかかわらず、C# UI が応答しません。

また、負荷の高いタスクを開始する C 関数を C# に公開し、C# がその関数を別のスレッドで実行できるようにしました。

何があっても、集中的なタスクが実行されると、C# が動かなくなり、C# プログラムが応答しなくなります。

プログラム全体を C で作成し、問題なく動作することを忘れていましたが、将来の .NET プロジェクトでこれを使用するために C# ライブラリを作成したいと考えています。

[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();

}
4

2 に答える 2

0

使用している C# UI テクノロジ (WPF または Winforms) を指定しておらず、UI コードの例も示していないため、一般的な回答を試してみます
。単純なユーティリティ ライブラリとしてコードを作成し、そこでスレッド処理を実行しようとしません。C# コードでバックグラウンド スレッドを管理します。Backgroundworker.Net UI には、バックグラウンドで長いタスクを実行しながら UI の応答性を維持するための多くのスレッド化手法Dispatcher.InvokeありControl.Invokeます。

于 2011-09-24T19:51:30.007 に答える
0

スレッドの優先度を下げる必要があります。これはプログラムだけでなく、システムにも発生すると思います。プログラムで発生した場合、メイン アプリ スレッドで他に何も行われておらず、実際には別のスレッドで実行されていると確信していますか?

スレッドの優先度を下げてみてください - サービス内で実行されているスレッドの CPU 使用率をプログラムで制限するを参照してください。

于 2011-09-23T19:54:46.853 に答える