2016-07-17 3 views
0

C#プログラムで2つの異なるスレッドを開始しています。最初のものはクリップボードを盗聴すべき形式であり、2番目はクリップボードに書き込むJavaプログラムを開始するものです。 呼び出しは次のようになります。C#でのAutoResetEventとフォームの呼び出し

 new Thread(() => StartClipListening()).Start(); 
     new Thread(() => executeScripts(path2Sikuli, path2Scripts, SikVars)).Start(); 
     SuccFailEvent.WaitOne(); 
     SuccFailEvent.Reset(); 

2番目のスレッドが正常に動作しているが、それもクリップボード盗聴を開始する前に閉じた後、最初に呼ばれると、書き込みされています。私は、次のものをやっている形式で

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); 
    } 

と呼ばれる方法はこの1つである:あなたのために事前に

 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(); 
    } 

は、今私は、ポーリングの問題を抱えているが、別の話のthats。ありがとう!

関連する問題