0

请看下面的代码

#pragma once

#include "Email.h"

    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Threading;
    using namespace SMSLib;

    /// <summary>
    /// Summary for NotifyAlarm
    /// </summary>
    public ref class NotifyAlarm : public System::Windows::Forms::Form
    {
        int count;
        Email ^email;

    public:
        NotifyAlarm(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
            count = 10;
            //email = gcnew Email();
        }

    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~NotifyAlarm()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::Label^  label1;
    protected: 
    private: System::Windows::Forms::Label^  secondsLabel;
    private: System::Windows::Forms::Label^  label2;
    private: System::Windows::Forms::Button^  sendNowBtn;
    private: System::Windows::Forms::Button^  cancelBtn;
    private: System::Windows::Forms::Timer^  timer1;
    private: System::ComponentModel::IContainer^  components;


    private:
        /// <summary>
        /// Required designer variable.
        /// </summary>


#pragma region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        void InitializeComponent(void)
        {
            this->components = (gcnew System::ComponentModel::Container());
            this->label1 = (gcnew System::Windows::Forms::Label());
            this->secondsLabel = (gcnew System::Windows::Forms::Label());
            this->label2 = (gcnew System::Windows::Forms::Label());
            this->sendNowBtn = (gcnew System::Windows::Forms::Button());
            this->cancelBtn = (gcnew System::Windows::Forms::Button());
            this->timer1 = (gcnew System::Windows::Forms::Timer(this->components));
            this->SuspendLayout();
            // 
            // label1
            // 
            this->label1->AutoSize = true;
            this->label1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
                static_cast<System::Byte>(0)));
            this->label1->Location = System::Drawing::Point(13, 27);
            this->label1->Name = L"label1";
            this->label1->Size = System::Drawing::Size(405, 20);
            this->label1->TabIndex = 0;
            this->label1->Text = L"Intruder Detected. An Email and SMS will be sent within ";
            // 
            // secondsLabel
            // 
            this->secondsLabel->AutoSize = true;
            this->secondsLabel->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
                static_cast<System::Byte>(0)));
            this->secondsLabel->ForeColor = System::Drawing::Color::Red;
            this->secondsLabel->Location = System::Drawing::Point(408, 27);
            this->secondsLabel->Name = L"secondsLabel";
            this->secondsLabel->Size = System::Drawing::Size(51, 20);
            this->secondsLabel->TabIndex = 1;
            this->secondsLabel->Text = L"label2";
            // 
            // label2
            // 
            this->label2->AutoSize = true;
            this->label2->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
                static_cast<System::Byte>(0)));
            this->label2->Location = System::Drawing::Point(465, 27);
            this->label2->Name = L"label2";
            this->label2->Size = System::Drawing::Size(69, 20);
            this->label2->TabIndex = 2;
            this->label2->Text = L"seconds";
            // 
            // sendNowBtn
            // 
            this->sendNowBtn->Location = System::Drawing::Point(370, 70);
            this->sendNowBtn->Name = L"sendNowBtn";
            this->sendNowBtn->Size = System::Drawing::Size(75, 23);
            this->sendNowBtn->TabIndex = 3;
            this->sendNowBtn->Text = L"Send Now";
            this->sendNowBtn->UseVisualStyleBackColor = true;
            this->sendNowBtn->Click += gcnew System::EventHandler(this, &NotifyAlarm::sendNowBtn_Click);
            // 
            // cancelBtn
            // 
            this->cancelBtn->Location = System::Drawing::Point(469, 70);
            this->cancelBtn->Name = L"cancelBtn";
            this->cancelBtn->Size = System::Drawing::Size(75, 23);
            this->cancelBtn->TabIndex = 4;
            this->cancelBtn->Text = L"Cancel";
            this->cancelBtn->UseVisualStyleBackColor = true;
            this->cancelBtn->Click += gcnew System::EventHandler(this, &NotifyAlarm::cancelBtn_Click);
            // 
            // timer1
            // 
            this->timer1->Enabled = true;
            this->timer1->Interval = 1000;
            this->timer1->Tick += gcnew System::EventHandler(this, &NotifyAlarm::timer1_Tick);
            // 
            // NotifyAlarm
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(566, 105);
            this->Controls->Add(this->cancelBtn);
            this->Controls->Add(this->sendNowBtn);
            this->Controls->Add(this->label2);
            this->Controls->Add(this->secondsLabel);
            this->Controls->Add(this->label1);
            this->Name = L"NotifyAlarm";
            this->Text = L"NotifyAlarm";
            this->ResumeLayout(false);
            this->PerformLayout();

        }
#pragma endregion
    private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) 
             {
                 count--;
                 DoUpdateText(count);

             }
private: System::Void sendNowBtn_Click(System::Object^  sender, System::EventArgs^  e) 
         {
             timer1->Stop();


         }

public: System::Void showGUI() 
                  {
                      this->Show();
                  }
private: System::Void cancelBtn_Click(System::Object^  sender, System::EventArgs^  e) 
         {
             timer1->Stop();
             this->Close();
         }





        delegate void UpdateTextDelegate(int count);

private: void DoUpdateText(int count)
         {
             ISynchronizeInvoke^ i = this;

             if (i->InvokeRequired)
             {
                 UpdateTextDelegate^ tempDelegate =
                     gcnew UpdateTextDelegate(this, &NotifyAlarm::DoUpdateText);
                 cli::array<System::Object^>^ args = gcnew cli::array<System::Object^>(1);
                 args[0] = count;
                 i->BeginInvoke(tempDelegate, args);
                 return;
             }

             if(count>0 || count==0)
             {
                 secondsLabel->Text = ""+count;
             } 
             else
             {
                 timer1->Stop();



                 this->Close();

             }
         }
};

上面的代码显示了一个用于生成通知的 Windows 窗体。我在另一个线程中运行这个类。下面是我如何在另一个类中设置线程

na = gcnew NotifyAlarm();
Thread ^t = gcnew Thread(gcnew System::Threading::ThreadStart(na,&NotifyAlarm::showGUI));
t->Start();

我遇到的问题是,表单显示正常,但一秒钟后,它消失了。无论在表单内运行的进程似乎正在运行,但在后台运行,而不会显示表单。

注意这里:

    delegate void UpdateTextDelegate(int count);

private: void DoUpdateText(int count)
         {
             ISynchronizeInvoke^ i = this;

             if (i->InvokeRequired)
             {
                 UpdateTextDelegate^ tempDelegate =
                     gcnew UpdateTextDelegate(this, &NotifyAlarm::DoUpdateText);
                 cli::array<System::Object^>^ args = gcnew cli::array<System::Object^>(1);
                 args[0] = count;
                 i->BeginInvoke(tempDelegate, args);
                 return;
             }

             if(count>0 || count==0)
             {
                 secondsLabel->Text = ""+count;
             } 
             else
             {
                 timer1->Stop();



                 this->Close();

             }
         }
};

这就是表单在线程内工作的地方。

在另一个线程中显示此表单对我来说非常重要。为什么它正在消失?

更新

使用后

System::Void showGUI() {
  Application::Run(*this);
}

我收到了这个错误

1>c:\users\yohan\documents\visual studio 2010\projects\ eesystem\eesystem\NotifyAlarm.h(182): error C2665: 'System::Windows::Forms::Application::Run' : none of the 3 overloads could convert all the argument types
1>          c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\system.windows.forms.dll: could be 'void System::Windows::Forms::Application::Run(System::Windows::Forms::Form ^)'
1>          c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\system.windows.forms.dll: or       'void System::Windows::Forms::Application::Run(System::Windows::Forms::ApplicationContext ^)'
1>          while trying to match the argument list '(NotifyAlarm)'
4

1 回答 1

1

这里的问题是你只是在打电话this->Show()。这最多将显示一次表单。它不会设置消息循环,因此它不会响应任何用户操作,也不会在第一次之后重绘自己。要解决此问题,您需要设置一个消息循环Application::Run

System::Void showGUI() {
  Application::Run(this);
}
于 2013-08-22T16:49:48.327 回答