2011-09-23 79 views
1

我写了执行两个任务的C DLL:多线程:C#程序运行C DLL - 不响应C#

1)继电器某些信息到C#程序

2)在不同的线程执行密集的任务

尽管C在不同的线程上运行密集型任务,但它仍然可以正常工作,但C#UI无响应。

我也暴露了C函数,它将C11的密集任务踢开,允许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(); 

} 
+0

由于没有反应,你的意思是呆滞或根本没有反应? –

+1

请向我们展示调用该任务的代码。 –

+0

我不认为有任何代码涉及,是吗? –

回答

0

您需要减少线程的优先级。我假设这发生在你的系统上,而不仅仅是程序。如果它发生在你的程序中,你确定在主应用程序线程中没有其他事情发生,并且它确实在单独的线程上运行?

尝试减少线程的优先级 - 看到: Programmatically limit CPU Usage of a Thread running inside a Service

+0

该系统似乎根本没有受到影响。我确实把线程的优先级降低到了正常但相同的情况。奇怪的效果似乎是我可以在UI中移动并关闭窗口而没有任何问题,但我无法按任何按钮。 – Hans

+0

将你的c调用伪装成一些其他的.net方法,它可以让一个while循环寻找一个真正的Val。看看它是不是一个奇怪的互操作。 –

+0

我伪装成一个.NET方法,而不是它工作正常。你可能是对的,这是互操作性的一个怪事。 – Hans

0

我会尝试一个笼统的回答,因为你还没有指定哪些C#UI技术,您正在使用(WPF或的WinForms),却没有给出你的UI代码的任何例子:
我认为你最好把你的C代码保存为一个简单的实用程序库,而不要尝试在那里做任何线程化的东西,让C#代码管理后台线程。 .Net UI有很多线程技术来保持UI的响应,同时在后台执行一些长时间的任务,例如:Backgroundworker,Dispatcher.Invoke,Control.Invoke等等(例如,看看this question)。

+0

Windows.Forms。但是我已经尝试过让C dll执行简单的实用程序,同时允许C#为我管理线程。 UI代码本身是微不足道的。这只是一个启动和停止进程的按钮,它本质上是调用task_ToggleTask()。 – Hans

+0

那么为什么它不调用窗体的BeginInvoke内的task_Calculate呢? –

+0

它可以做到。发生同样的问题。如果您有任何疑问,我会再次进行测试。我已经有了一个纯C版本。我将它转换为一个库,然后让C管理UI和线程,这样.NET就不必参与进来,直到需要最终结果。 – Hans