2016-07-17 3 views
0

Я запускаю 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(); 
      } 
     } 
    } 

Заранее спасибо за ваш Помогите!

+0

Вы не можете получить доступ к буферу из рабочего потока. Для этого требуется поток STA и Application.Run(). Основной поток приложения Winforms достаточно хорош, точка WM_CLIPBOARDUPDATE не должна ждать изменения буфера обмена. –

ответ

0

я уже решил ее теперь следующим образом:

private void StartClipListening() 
    { 
     var clites = new CBForm(); 
     clites.Start_Lintening(this); 
     clites.Show(); 
    } 
    private void StarttwoTasks(string path2Sikuli, string path2Scripts, SikuliVariables SikVars) 
    { 
     StartClipListening();   
     new Thread(() => executeScripts(path2Sikuli, path2Scripts, SikVars)).Start(); 
     new Thread(() => waitforthat###()).Start(); 
    } 
    private void waitforthat###() 
    { 
     SuccFailEvent.WaitOne(); 
     SuccFailEvent.Reset(); 
    } 

Теперь у меня есть проблемы опроса, но вот другая история. Благодаря!