-1

私は.NETにこのコードを持っています:

 result = NativeMethods.gsapi_init_with_args(_ghostScriptInstance, args.Length, _argumentPointersHandle.AddrOfPinnedObject());

次に、このコードを実行します

[DllImport("C:\\gsdll64.dll", EntryPoint = "gsapi_init_with_args")]
public static extern int gsapi_init_with_args(IntPtr instance, int argc, IntPtr argv);

問題は、まだ未知の問題のため、ネイティブ実行が無限ループに入り、決して戻らないことです。

問題は、このネイティブなものの実行時間をどのように制限できるかです。NativeMethods.gsapi_init_with_args1分以内に戻らない場合は、ネイティブ実行を強制終了して戻るように.NETに伝えることはできますか?

4

1 に答える 1

0

おそらく、新しいスレッドでメソッドを呼び出し、呼び出しが時間内に完了しない場合はスレッドを強制終了します。スレッドを強制終了するのは悪いことですが、この特定のケースでは、ネイティブ関数のソースコードにアクセスできないと想定しています。

どういうわけか、Thread.Abortは機能しません(相互運用スレッドがどのように機能するかを理解しようとします)。マネージスレッドを作成する代わりに、CreateThreadを使用してネイティブスレッドを作成し、タイムアウト後に終了できます。

[DllImport("Library.dll")]
public static extern void InfiniteLoop();

[DllImport("kernel32")]
private static extern int CreateThread(
   IntPtr lpThreadAttributes,
   UInt32 dwStackSize,
   IntPtr lpStartAddress,
   IntPtr param,
   UInt32 dwCreationFlags,
   UInt32 lpThreadId
 );

[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern int TerminateThread(int hThread);

[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetLastError();

private delegate int InvokeInfiniteLoop(IntPtr args);

static void Main(string[] args)
{
      InvokeInfiniteLoop invokeInfiniteLoop = (args1) =>
                                                    {
                                                        InfiniteLoop();
                                                        return 0;
                                                    };
     IntPtr infiniteLoopPtr = Marshal.GetFunctionPointerForDelegate(invokeInfiniteLoop);
     int handle = CreateThread(IntPtr.Zero, 0, infiniteLoopPtr, IntPtr.Zero, 0, 0);
     Thread.Sleep(TimeSpan.FromSeconds(5));
     int terminated = TerminateThread(handle);
     Console.WriteLine(terminated);
}

注意点として、スレッドの終了は危険です。ここですべてを読むことができます:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms686717 (v=vs.85).aspx 。HansPassantは正しいです。ソースが利用可能な場合は、それをデバッグしてバグを特定できます。

于 2012-08-18T23:38:06.587 に答える