2016-08-28 3 views
0

Ich habe eine Anwendung, die Ihre Webcam ein- und ausschaltet. Es schaltet es ein, auf einem neuen Thread und ich versuche, einen Knopf vom Hauptcode arbeiten zu lassen, um ihn abzustellen, aber Kreuzthreading funktioniert nicht und da es kein Formular ist, kann ich nicht aufrufen. hier ist der Code:C# cross Threading ohne Formular

public class Program 
{ 
    public static FilterInfoCollection CaptureDevicesList; 
    public static VideoSourcePlayer videoSourcePlayer = new VideoSourcePlayer(); 
    public static VideoCaptureDevice videoSource; 
    public static System.Timers.Timer TimerClose = new System.Timers.Timer(); 

    [STAThread] 
    static void Main() 
    { 
     TimerClose.Elapsed += (o, e) => TimerClose_Tick(); 
     TimerClose.Interval = 10000; 
     TimerClose.Start(); 
     new Thread(() => 
     { 
      Thread.CurrentThread.IsBackground = true; 
      CaptureDevicesList = new FilterInfoCollection(FilterCategory.VideoInputDevice); 
      Class1.oncam(); 
     }).Start(); 

     Application.Run(); 
    } 

    private static void TimerClose_Tick() 
    { 
     Class1.CloseCurrentVideoSource(); // <--- function cant run 
    } 
} 

Also, was im zu tun versuchen, ist die enge Funktion zu arbeiten, die die Webcam auszuschalten versucht, die auf einem anderen Thread ausgeführt wird. Hier ist class1:

class Class1 
{ 
    public static void oncam() 
    { 
     Program.videoSource = new VideoCaptureDevice(Program.CaptureDevicesList[0].MonikerString); 

     OpenVideoSource(Program.videoSource); 
    } 

    public static void OpenVideoSource(IVideoSource source) 
    { 
     CloseCurrentVideoSource(); 

     Program.videoSourcePlayer.VideoSource = source; 
     Program.videoSourcePlayer.Start(); 
    } 

    public static void CloseCurrentVideoSource() 
    { 
     if (Program.videoSourcePlayer.VideoSource != null) 
     { 
      Program.videoSourcePlayer.SignalToStop(); 

      for (int i = 0; i < 30; i++) 
      { 
       if (!Program.videoSourcePlayer.IsRunning) 
        break; 
       System.Threading.Thread.Sleep(100); 
      } 

      if (Program.videoSourcePlayer.IsRunning) 
      { 
       Program.videoSourcePlayer.Stop(); 
      } 

      Program.videoSourcePlayer.VideoSource = null; 
     } 
    } 
} 

Jede Hilfe ist appriciated

+0

Ich mache nicht viel mit Multi-Threaded-Anwendungen neben Diensten gelegentlich, aber warum ist jede einzelne Variable und Methode Sie statisch? Erhöht das nicht standardmäßig Thread-Sicherheitsprobleme? j/w –

+0

Wie wollen Sie eine private Methode aufrufen, ohne sie aufzurufen? Mit anderen Worten, wie erwarten Sie, dass die Close-Methode ausgelöst wird? –

+0

sein Teil eines viel größeren Programms und ich bekam alle Arten von Schwierigkeiten, wenn sie nicht statisch war, so änderte ich sie alle nur auf statische, wenn es eine Reparatur, die mich erfordert, um es zu ändern, das ist in Ordnung –

Antwort

0

VideoSourcePlayer erbt von System.Windows.Forms.Control und erfordert somit Synchronisation für Cross-Thread-Zugang.

Rufen Sie bei diesem Steuerelement Invoke auf, wenn Sie von einem anderen Thread darauf zugreifen.

+0

können Sie mir sagen, wie ich es pleae schreiben würde –

+0

Es gibt Gazillions von SO Fragen zu diesem Thema, z. http://stackoverflow.com/questions/142003/cross-thread-operation-not-valid-control-accessed-from-a-thread-other-than-the – Rotem

+0

ich weiß, aber ich kann nicht scheinen, einen in meiner Position zu finden . Wie kann ich "Program.Invoke (new MethodInvoker (Delegat { WebCam.TurnOffWebCam(); }));" aber Programm kann nicht aufrufen, gibt es kein Formular, so bin ich nicht sicher, was ich stattdessen setzen –