Я запускаю 2 разных потока в программе на C#. Первая - это форма, которая должна обнюхивать буфер обмена, а вторая запускает программу java, которая записывает в буфер обмена. Вызывающий выглядит следующим образом:AutoResetEvent на C# и вызывая форму
new Thread(() => StartClipListening()).Start();
new Thread(() => executeScripts(path2Sikuli, path2Scripts, SikVars)).Start();
SuccFailEvent.WaitOne();
SuccFailEvent.Reset();
Второй поток работает нормально, но первое, что называется и писать после этого закрыли еще до начала буфера обмена нюхают. Это выглядит следующим образом:
private void StartClipListening()
{
var clites = new CBForm();
clites.Start_Lintening(this);
clites.Show();
}
В форме я делаю следующий материал:
public void Start_Lintening(TradingExecution trex)
{
this.trex = trex;
//this.are = are;
AddClipboardFormatListener(this.Handle);
}
const int WM_CLIPBOARDUPDATE = 0x31D;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_CLIPBOARDUPDATE:
IDataObject iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Text))
{
label1.Text = (string)iData.GetData(DataFormats.Text);
trex.ClipboardMonitor_OnClipboardChange (label1.Text);
Stop_listening();
this.Close();
}
break;
default:
base.WndProc(ref m);
break;
}
}
public void Stop_listening()
{
RemoveClipboardFormatListener(this.Handle);
}
и вызываемый метод это один:
public void ClipboardMonitor_OnClipboardChange(string data)
{
var ClipboardText = data;
string[] dataInSlices = ClipboardText.Split(';');
try
{
Clipboard.Clear();
}
catch (Exception)
{
}
if (dataInSlices.Count() > 1)
{
if (dataInSlices[1] == "Success")
{
logger.Info("Sccess executing Sikuli");
SuccessExecute = true;
FailureStep = 0;
Failureval = dataInSlices[2];
SuccFailEvent.Set();
}
else if (dataInSlices[1] == "Failure")
{
logger.Info("Failure executing Sikuli");
try
{
FailureStep = Int32.Parse(dataInSlices[0]);
}
catch (Exception)
{
}
SuccessExecute = false;
Failureval = dataInSlices[2];
SuccFailEvent.Set();
}
}
}
Заранее спасибо за ваш Помогите!
Вы не можете получить доступ к буферу из рабочего потока. Для этого требуется поток STA и Application.Run(). Основной поток приложения Winforms достаточно хорош, точка WM_CLIPBOARDUPDATE не должна ждать изменения буфера обмена. –