我有一个控制视频采集卡的程序。这张卡有几个输入,我的任务是编写一个从所有输入开始捕获的方法。不幸的是,在SDK中,我只能调用处理一个按钮的单击事件的方法。我有一个想法,写一些线程同时为每个按钮调用此方法,该按钮由指定的输入呈现。
这是我的主题。我打电话并提供选择开始的按钮的参考。
private class StartThread
{
private static DateTime startTime; //arbitrary start time
private Button btnStart;
public static void initializeTimer()
{
startTime = DateTime.Now.AddSeconds(5); //arbitrary start time
}
public StartThread(Button btnTmp)
{
this.btnStart = btnTmp;
}
public delegate void DelegateStandardPattern();
public void doWork()
{
while (DateTime.Now < startTime) ;
btnStart.PerformClick();
}
};
我检查指定的开始按钮是否应该开始并创建线程:
private void btnStartAllClick(object sender, EventArgs e)
{
int i = 0, j = 0;
List<Thread> listThreads = new List<Thread>();
for (i = 0; i < miInstalledCardNum; i++)
{
for (j = 0; j < mCard[i].iDeviceNum; j++)
{
if (mCard[i].Device[j].ChkBoxStartAll.Checked == true &&
mCard[i].Device[j].ChkBoxStartAll.Enabled == true)
{
StartThread tmpThread = new StartThread(mCard[i].Device[j].BtnStart);
listThreads.Add(new Thread(tmpThread.doWork));
}
}
}
if(listThreads.Count > 0){
StartThread.initializeTimer();
foreach(Thread currentThread in listThreads)
currentThread.Start();
foreach (Thread currentThread in listThreads)
currentThread.Join();
}
}
不幸的是,此操作返回异常:
Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on.
我尝试了女巫InvokeRequired
:
if (this.InvokeRequired)
{
this.Invoke(
new MethodInvoker(
delegate() { ThreadSafeFunction(intVal, boolVal); }));
}
else
{
//use intval and boolval
}
但我得到另一个错误:
不包含&#39; Invoke&#39;的定义没有扩展方法&#39;调用&#39;接受类型&#39; fmb_player_apl.MasterForm.StartThread&#39;的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)
我必须启动四个按钮并行,因为它会导致异步视频。
答案 0 :(得分:0)
不幸的是,在SDK中,我只能调用处理单个按钮的点击事件的方法。
那声音令人难以置信的腥味。你有一个控制UI的SDK?那太糟了。这不是SDK应该是什么。获得您想要做的任何其他提供者。
在UI 中并行执行是不可能的。即使你并行执行(这不会像你想象的那样),也没有Windows技术允许他们构建一个UI来允许你并行执行。所有UI的工作原理是让UI线程处理事件队列......一个接一个地处理它们。
只是按顺序调用它们中的所有内容而没有介于两者之间的速度足够快吗?因为这是你能做的最好的事情。