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
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 –
Wie wollen Sie eine private Methode aufrufen, ohne sie aufzurufen? Mit anderen Worten, wie erwarten Sie, dass die Close-Methode ausgelöst wird? –
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 –