0

現在、Windows フォーム アプリケーションを C# のコンソール アプリケーションに変換しています。

コードを変換するのに忙しく、正しく変換する方法がわからないいくつかの構文に問題があります。Windows フォーム アプリの元のコードは次のとおりです。

    private eSkan.api.TeSkanAPI feSkanAPI = null;

    private void MessageFilter_AddRemove_Invoked(bool AddFilter, IMessageFilter Filter)
    {
        if (AddFilter)
        { 
            Application.AddMessageFilter(Filter); 
        }
        else 
        { 
            Application.RemoveMessageFilter(Filter); 
        }
    }
    private void MessageFilter_AddRemove(bool AddFilter, IMessageFilter Filter)
    {
        {
            IAsyncResult sr = BeginInvoke((ESKAN_ADD_REMOVE_MESSAGEFILTER)MessageFilter_AddRemove_Invoked,
                                          AddFilter, Filter);
            sr.AsyncWaitHandle.WaitOne(2000);
        }
    }

    private void IniteSkan()
    {
        lMSG.Items.Clear();
        feSkanAPI = new TeSkanAPI();
        // To add a message filter you have to add it from the MAIN thread - thus the main form
        feSkanAPI.AddRemoveMessageFilterProc = MessageFilter_AddRemove;
        feSkanAPI.OneSkanEvent += eScan_Callback;
        feSkanAPI.Thread_Start(true);
    }

    public Form1()
    {
        InitializeComponent();

    }


    private void eScan_Callback_safe(EeSkan_EventType command, object Data)
    {

        lMSG.Items.Insert(0, "++++++++");
        lMSG.Items.Insert(0, DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss"));
        lMSG.Items.Insert(0, "New Command "+command.ToString());

        if (Data is TeSkan_EventInfo)
        {
            lMSG.Items.Insert(0, "Data File : " + ((TeSkan_EventInfo)Data).DataFile);
            lMSG.Items.Insert(0, "Image File : " + ((TeSkan_EventInfo)Data).ImageFile);
        } else if (Data is string)
        {
            lMSG.Items.Insert(0, "Data String : " + (string) Data); 
        }

        //lMSG.Items.Insert(0, "Image File " + ScanInfo.ImageFile);
        //lMSG.Items.Insert(0, "Data File " + ScanInfo.ImageFile);
        lMSG.Items.Insert(0, "--------");
    }

    /// <summary>
    /// When accesing GUI/Form/Components - you cannot work cross-thread.
    /// This method will invoke eScan_Callback_safe in main/GUI thread if another thread called it, 
    /// or call eScan_Callback_safe directly if already on GUI/main thread
    /// 
    /// </summary>
    /// <param name="ScanInfo"></param>
    private void eScan_Callback(EeSkan_EventType command, object Data)
    {


        if (InvokeRequired)
        {
            this.Invoke((ESKAN_EVENT_CALLBACK)eScan_Callback_safe, command, Data);
        }
        else
        {
            eScan_Callback_safe(command, Data);
        }
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        feSkanAPI.Thread_Stop(10000);
        feSkanAPI.Dispose();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        IniteSkan();
    }

Action を使用して、コンソール アプリケーションで BeginInvoke 部分を実行しています。そして、「eScan_Callback()」関数の「InvokeRequired」部分に使用するのに最適なものを知りたいです。

4

2 に答える 2

1

InvokeRequired現在のスレッドが winforms コントロールに安全にアクセスできるかどうかを確認することです。コンソール アプリケーションに変換する場合は、おそらくこれを「else」ブロック内の標準メソッド呼び出しに置き換えることができます。

ただし、これはいくつかのスレッド処理を行っているように見えるので、コピー アンド ペーストの仕事ではなく、このフォームが全体的に何をしているのかを見て、より「コンソールっぽい」方法で書き直します。

于 2013-04-19T14:14:39.057 に答える
0

あなたがコンソールアプリケーションを作成していることを読んで、このコードは必要ないと思います.eScan_Callback_safe(command, Data);

于 2013-04-19T14:16:14.947 に答える