Задать вопрос
@mIka01

Как вызвать CreateThread внутри Form?

Здраствуйте, у меня вопрос из за незнания языка программирования.
Не могу понять как вызвать функцию CreateThread внутри формы Form.
Вызываемая строчка выглядит так.
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ClientHandler_second, NULL, NULL, NULL);


Cама функция выглядит так void ClientHandler_second() { ... }
Моё предположения, что я просто не там объявляю функцию.

Как я могу вызывать поток и объявлять функцию без ошибок?

Заранее благодарю.
  • Вопрос задан
  • 233 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
@Mercury13
Программист на «си с крестами» и не только
Tony сказал правильно, но есть ещё одна вещь.
CreateThread использовать ЗАПРЕЩАЕТСЯ. Точнее, можно — но для этого нужно знать, что делаешь. А так для прикладного прогера правило — надо перевести библиотеку времени выполнения в многопоточный режим, и для этого вызвать аналог из этой самой библиотеки. В Си++ для этого используется функция beginthreadex(), в Delphi — BeginThread.
Ответ написан
Комментировать
@none7
Пример
#include <Windows.h>

DWORD WINAPI ThreadProc(LPVOID param); // строчка необходима, чтобы весь код выше реализации функции её видел
public ref class Form1 : System::Windows::Forms::Form {
    System::Windows::Forms::Button^ button1;
    System::Windows::Forms::Label^ label1;

    void InitializeComponent() {
        this->button1 = gcnew System::Windows::Forms::Button();
        this->label1 = gcnew  System::Windows::Forms::Label();
        this->SuspendLayout();

        this->button1->Location = System::Drawing::Point(205, 95);
        this->button1->Name = "button1";
        this->button1->Size = System::Drawing::Size(75, 23);
        this->button1->TabIndex = 0;
        this->button1->Text = "button1";
        this->button1->UseVisualStyleBackColor = true;

        this->label1->AutoSize = true;
        this->label1->Location = System::Drawing::Point(218, 153);
        this->label1->Name = "label1";
        this->label1->Size = System::Drawing::Size(44, 16);
        this->label1->TabIndex = 1;
        this->label1->Text = "label1";

        this->AutoScaleDimensions = System::Drawing::SizeF(8.0, 16.0);
        this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
        this->ClientSize = System::Drawing::Size(485, 292);
        this->Controls->Add(this->label1);
        this->Controls->Add(this->button1);
        this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedSingle;
        this->MaximizeBox = false;
        this->Name = "Form1";
        this->Text = "Form1";
        this->ResumeLayout(false);
        this->PerformLayout();
    }
public:
    static Form1^ myform;
    Form1() {
        InitializeComponent();
        myform = this;
        button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
    }
    void SetLabel(System::Int32 i) {
        label1->Text = i.ToString();
    }
private:
    void button1_Click(System::Object^ sender, System::EventArgs^ e) {
        ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, NULL, 0, NULL);
    }
};
DWORD WINAPI ThreadProc(LPVOID param) {
    for (int i = 1; i <= 5; i++) {
        ::Sleep(1000);
        // Invoke вызывает указанный метод в потоке окна. MS не обещает синхронизацию
        // потоков для gui-кода. Если не использовать данный метод, то в худшем случае приложение
        // упадёт внутри небезопасных библиотек
        // то есть никаких нормальных исключений не будет. Только хардкорный SEH.
        Form1::myform->Invoke(gcnew System::Action<System::Int32>(Form1::myform, &Form1::SetLabel), i);
    }
    return 0;
}
int main(array<System::String^>^ args) {
    System::Windows::Forms::Application::EnableVisualStyles();
    System::Windows::Forms::Application::SetCompatibleTextRenderingDefault(false);
    System::Windows::Forms::Application::Run(gcnew Form1());
    return 0;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AntonSazonov
https://docs.microsoft.com/en-us/previous-versions..."
Прототип функции потока выглядит так:
DWORD WINAPI ThreadProc( LPVOID lpParameter );
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы