Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Visual C++
Перезагрузить страницу Опять мультипотоки :)
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
daniilpetrov daniilpetrov вне форума
Member
 
Аватар для daniilpetrov
 
Сообщений: 213
Сказал(а) спасибо: 33
Поблагодарили 3 раз(а) в 2 сообщениях
Регистрация: 10.06.2011
Адрес: Россия
По умолчанию Опять мультипотоки :) - 29.09.2014, 14:02

Я уже весь мозг сломал подскажите, пожалуйста, в чём может быть загвоздка...
cpp Код:
// Создаём поток
thread* MultiThreadProcessOne = new thread(MultiThreadProcess_1);

// В процедуре потока крутится цикл
while (TRUE) {
    // Проверяется флаг, если флаг равен TRUE, то выполняется break
}
// Перед удалением потока устанавливаем флаг в TRUE и удаляем поток
if (MultiThreadProcessOne->joinable())
    MultiThreadProcessOne->join();
delete MultiThreadProcessOne;
если раньше было достаточно глобальной переменной для передачи значения флага, то потом процедура потока вообще перестала воспринимать глобальные переменные, я начал передавать их через стек (#include <stack>), но потом она перестала реагировать и на него. Всё время зависает на процедуре JOIN, так как цикл не прерывается... SOS!!! а то мой мозг совсем сломается!!!
Ответить с цитированием
  (#2 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 7,448
Сказал(а) спасибо: 22
Поблагодарили 944 раз(а) в 928 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 29.09.2014, 14:55

Создай свой класс, хранящий и созданный поток, и флаг для его завершения. Никаких шлобальных переменных. Поток должен обращаться только к данным своего класса.
Вместо Join можно задействовать WaitHandle и его варианты.
Ответить с цитированием
  (#3 (permalink)) Старый
daniilpetrov daniilpetrov вне форума
Member
 
Аватар для daniilpetrov
 
Сообщений: 213
Сказал(а) спасибо: 33
Поблагодарили 3 раз(а) в 2 сообщениях
Регистрация: 10.06.2011
Адрес: Россия
По умолчанию 29.09.2014, 16:02

Я создавал класс, но с ним возникла проблема: каким образом из конструктора класса ИмяКласса::ИмяКласса() создать поток, указывая процедуру из этого же класса??? Простое std::thread * ИмяПотока = new std::thread(ИмяПроцедуры) имя процедуры схавать не может так можно протолкнуть только процедуру, не входящую в какой-либо класс!
Ответить с цитированием
  (#4 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 7,448
Сказал(а) спасибо: 22
Поблагодарили 944 раз(а) в 928 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 29.09.2014, 17:16

cpp Код:
---------------------------- test_server/thread.cpp ----------------------------
new file mode 100644
index 0000000..5282f91
@@ -0,0 +1,79 @@
#include "StdAfx.h"
#include "thread.h"
#include <WinDef.h>
#include <WinBase.h>
#include <process.h>

Thread::Thread(void)
{
    this->mMainThread = NULL;
    this->mTerminateEvent = CreateEvent(NULL, TRUE, FALSE, L"Thread Need Stop Event");
    ResetEvent(this->mTerminateEvent);
}


Thread::~Thread(void)
{
    this->stop();
}

void Thread::start()
{
    unsigned threadId;

    //this->mMainThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread::thread_entry_point(this), this, 0, NULL);
   
    this->mMainThread = (HANDLE)_beginthreadex(
        NULL, // security
        0,    // stack size
        Thread::thread_entry_point,// entry-point-function
        this,           // arg list holding the "this" pointer
        CREATE_SUSPENDED, // so we can later call ResumeThread()
        &threadId);
   
    ResetEvent(this->mTerminateEvent);
    ResumeThread(this->mMainThread);
}

void Thread::stop()
{
    if (this->mMainThread != NULL) {
        SetEvent(this->mTerminateEvent);

        WaitForSingleObject(this->mMainThread, INFINITE );

        this->mMainThread = NULL;
    }
}

unsigned Thread::thread_func()
{
    while (true) {
        unsigned waitResult = WaitForSingleObject(this->mTerminateEvent, 1000);

        if (waitResult == WAIT_OBJECT_0) {
            // thread stopped
            break;
        } else if(waitResult == WAIT_TIMEOUT) {
            // thread running
        } else {
            // error
            return 1;
        }
    }

    return 0;
}

unsigned __stdcall Thread::thread_entry_point(LPVOID param)
{
    Thread* obj = static_cast<Thread*>(param);

    unsigned result = obj->thread_func();    // now call the true entry-point-function

    // A thread terminates automatically if it completes execution,
    // or it can terminate itself with a call to _endthread().

    // the thread exit code
    return result;
}

----------------------------- test_server/thread.h -----------------------------
new file mode 100644
index 0000000..8a073cf
@@ -0,0 +1,22 @@
#pragma once

#include <wchar.h>
#include <Windows.h>

class Thread
{
public:
    Thread(void);
    ~Thread(void);

    void start();
    void stop();

protected:
    virtual unsigned thread_func();
    HANDLE mTerminateEvent;

private:
    HANDLE mMainThread;
    static unsigned __stdcall thread_entry_point(LPVOID param);
};


cpp Код:
----------------------- test_server/socket_listener.cpp -----------------------
new file mode 100644
index 0000000..e4f9af3
@@ -0,0 +1,149 @@
#include "StdAfx.h"

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>

#include "socket_listener.h"

// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")

#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"


SocketListener::SocketListener(void) :
    Thread()
{
    this->mPort = 0;
}


SocketListener::~SocketListener(void)
{
}

void SocketListener::startListening(unsigned short port)
{
    this->mPort = port;

    this->start();
}

void SocketListener::stopListening()
{
    this->stop();
}

unsigned SocketListener::thread_func()
{
    WSADATA wsaData;
    int iResult;

    char portStr [10];
    _snprintf_s(portStr, sizeof(portStr), "%d", this->mPort);

    SOCKET ListenSocket = INVALID_SOCKET;
    SOCKET ClientSocket = INVALID_SOCKET;

    struct addrinfo *result = NULL;
    struct addrinfo hints;

    int iSendResult;
    char recvbuf[DEFAULT_BUFLEN];
    int recvbuflen = DEFAULT_BUFLEN;
   
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed with error: %d\n", iResult);
        return 1;
    }

    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;

    // Resolve the server address and port
    iResult = getaddrinfo(NULL, portStr, &hints, &result);
    if ( iResult != 0 ) {
        printf("getaddrinfo failed with error: %d\n", iResult);
        WSACleanup();
        return 1;
    }

    // Create a SOCKET for connecting to server
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    if (ListenSocket == INVALID_SOCKET) {
        printf("socket failed with error: %ld\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }

    // Setup the TCP listening socket
    iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen);
    if (iResult == SOCKET_ERROR) {
        printf("bind failed with error: %d\n", WSAGetLastError());
        freeaddrinfo(result);
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }

    freeaddrinfo(result);

    iResult = listen(ListenSocket, SOMAXCONN);
    if (iResult == SOCKET_ERROR) {
        printf("listen failed with error: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }

    while (true) {
        // Accept a client socket
        ClientSocket = accept(ListenSocket, NULL, NULL);
       
        if (ClientSocket == INVALID_SOCKET) {
            printf("accept failed with error: %d\n", WSAGetLastError());
            closesocket(ListenSocket);
            WSACleanup();
            return 1;
        }

        //unsigned listenerClientResult = this->listenClient(ClientSocket);

        unsigned waitResult = WaitForSingleObject(this->mTerminateEvent, 1000);

        if (waitResult == WAIT_OBJECT_0) {
            // thread stopped
            break;
        } else if(waitResult == WAIT_TIMEOUT) {
            // thread running
        } else {
            // error
            return 1;
        }

    }

    // this->listenClient(ClientSocket);

    // No longer need server socket
    closesocket(ListenSocket);


    return 0;
}

unsigned SocketListener::listenClient(SOCKET socket)
{
    return 0;
}
\ No newline at end of file

------------------------ test_server/socket_listener.h ------------------------
new file mode 100644
index 0000000..2e93689
@@ -0,0 +1,19 @@
#pragma once

#include "thread.h"

class SocketListener : private Thread
{
public:
    SocketListener(void);
    virtual ~SocketListener(void);

    void startListening(unsigned short port);
    void stopListening();

private:
    virtual unsigned thread_func();
    unsigned short mPort;
    unsigned listenClient(SOCKET socket);
};
Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
Alexiski (30.09.2014), daniilpetrov (29.09.2014)
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как юзать мультипотоки daniilpetrov Visual C++ 5 23.09.2014 16:53
Опять траблы с бп... SubXaN Блоки питания 29 09.03.2014 14:28
и опять я) Пердунчик Любые вопросы от новичков 20 07.12.2011 23:59
опять про кулер sanchoflat Охлаждение и разгон 5 23.10.2011 15:08
Опять видеокарта Clyde Barrow Любые вопросы от новичков 9 05.08.2011 08:24
Опять списки Chummy89 Prolog 17 27.11.2009 22:04
опять пятнашки король Prolog 6 28.05.2009 22:44
Опять пролог! ОПЯТЬ СПИСКИ! Kate&amp;Lena Prolog 10 26.02.2009 08:39
Опять звуковуха... outta Звук и акустические системы 4 22.11.2008 14:07
Опять списки, и опять на SWI. ler Prolog 3 02.02.2006 07:32
опять про UTF-8 EuG PHP 2 02.08.2005 17:50
Опять списки kronix Prolog 5 27.02.2005 09:21



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов