Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2015, 13:40   #1
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию Поток и вектор

Здравствуйте, подскажите пожалуйста что не так, вектор messages остаётся пустым всё время. Добавляю в main
Код:
class TWSAServer
{
	public: 
		std::vector<TMyMes*> messages;
//...
}

void TWSAServer::listenproc()
{
	if (listen(sock, 1) == 0)
	{
		std::cout << "Listener thread worked!" << std::endl;
		while (work == true)
		{
			static TMyMes *ms;
			while (!messages.empty())   // не срабатывает ибо всегда пуст!
			{
				ms = messages[0];
				if (ms->msg == 111)
				{
					std::cout << "Received " << ms->c1 << std::endl;
					break;
				}
				ms->result = 0;
				messages.erase(messages.begin());
			}
			//break;
		}
	}
	else
	{
		std::cout << "Error listen" << std::endl;
	}
}


int main
{
	TWSAServer serv;
	server.push_back(serv);  // вектор с серверами

	TMyMes *ms = new TMyMes;

	ms->msg = 111;
	ms->c1 = 123123;
	server[0].messages.push_back(ms);  // тут добавляю указатель в вектор для проверки
//
}
Ставил бряк в блоке while (!messages.empty()), результата 0
Здравствуйте
NEoMASTERR вне форума Ответить с цитированием
Старый 14.12.2015, 13:52   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А где listenproc() вызывается? Может до нее messages чистится?
И кстати. Я бы пользовался итератором, а не циклом с проверкой на пустой вектор, и удалением из него головы. Это так. Ремарка.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2015, 13:57   #3
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А где listenproc() вызывается? Может до нее messages чистится?
И кстати. Я бы пользовался итератором, а не циклом с проверкой на пустой вектор, и удалением из него головы. Это так. Ремарка.
listenproc вызывается и работает, бряк на цикле срабатывает но внутрь не заходит, всё касательно messages я написал, нигде ничего не чистится.

С итератором пробовал но мозгов не хватает, не знаю как вывести итератор в консоль даже, ругается кучей символов
Да и по окончании обработки сообщение мне не нужно, и можно удалять, если это затратный способ то позже пересмотрю, я пока ооочень новичок

Код:
class TWSAServer
{
	public: 
		int sock;
		std::vector<TMyMes*> messages;
		struct sockaddr_in addr;
		static void *listener(void *ptr) { ((TWSAServer *)ptr)->listenproc(); return NULL; }  // это удачно откуда то украдено, может тут проблема?
Код:
void TWSAServer::start()
{
	work = true;
	#ifdef LINUX
		pthread_t thread;
		pthread_create(&thread, NULL, TWSAServer::listener, (void*)this);
		pthread_detach(thread);
	#else
		std::thread thr(&TWSAServer::listenproc, *this);
		thr.detach();
	#endif
}

Суть в том что у потока есть очередь сообщений, сделать через postthreadmessage я не смог так как это std::thread поэтому сделал очередь вектором

Код:
	ms->msg = 111;
	ms->c1 = 123123;
	server[0].messages.insert(server[0].messages.begin(), ms);
после insert отладка показывает что size = 1; но в потоке 0
Здравствуйте

Последний раз редактировалось NEoMASTERR; 14.12.2015 в 14:01.
NEoMASTERR вне форума Ответить с цитированием
Старый 14.12.2015, 14:12   #4
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
Печаль



Спустя некоторое время массив всё еще не пуст, а в потоке пуст

И даже адрес у них один
Код:

///
std::vector<TWSAServer*> server;
///

	std::cout << server[0] << std::endl;
	std::cout << &serv << std::endl;
И обращаясь через serv.messages я добавляю сообщение в ту же корзину
В потоке всёравно результат size = 0
Здравствуйте

Последний раз редактировалось NEoMASTERR; 14.12.2015 в 14:22.
NEoMASTERR вне форума Ответить с цитированием
Старый 14.12.2015, 14:46   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
С итератором пробовал но мозгов не хватает, не знаю как вывести итератор в консоль даже, ругается кучей символов
Давай попробую подсказать:
Код:

void TWSAServer::listenproc()
{
	if (listen(sock, 1) == 0)
	{
		std::cout << "Listener thread worked!" << std::endl;
		for(vector<TMyMes*>::iterator vi=messages.begin;vi!=messages.end();vi++)
		{
			TMyMes *ms=*vi;
				if (ms->msg == 111)
				{
					std::cout << "Received " << ms->c1 << std::endl;
					break;
				}
				ms->result = 0;
			}
		}
	}
	else
	{
		std::cout << "Error listen" << std::endl;
	}
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2015, 14:56   #6
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Давай попробую подсказать:
Код:

void TWSAServer::listenproc()
{
	if (listen(sock, 1) == 0)
	{
		std::cout << "Listener thread worked!" << std::endl;
		for(vector<TMyMes*>::iterator vi=messages.begin;vi!=messages.end();vi++)
		{
			TMyMes *ms=*vi;
				if (ms->msg == 111)
				{
					std::cout << "Received " << ms->c1 << std::endl;
					break;
				}
				ms->result = 0;
			}
		}
	}
	else
	{
		std::cout << "Error listen" << std::endl;
	}
}
Спасибо, это сделал, но вектор всёравно пуст в потоке, мне начинает казаться что это какой то левый поток
Почему то даже вызвав serv.stop(); поток не завершается, я в конфузе.

Посмотрите весь проект?
Аттач
Здравствуйте

Последний раз редактировалось NEoMASTERR; 14.12.2015 в 15:03.
NEoMASTERR вне форума Ответить с цитированием
Старый 14.12.2015, 15:22   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Посмотрите весь проект?
К сожалению сейчас нет времени, без обид.
Занимаюсь прикручиванием драйвера одного к своему ПО
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2015, 23:28   #8
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

А теперь я еще больше в шоке, на линуксе код адекватно работает, видимо с потоками что то не так. Попробую через CreateThread...
Здравствуйте
NEoMASTERR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
процедуры и функции : Дан вектор A(n). Построить вектор B(n), i-ый элемент которого равен среднему арифметическому (Паскаль) vladicvladic123 Помощь студентам 2 04.12.2013 14:56
Дан вектор А(n). Получить новый вектор путем умножения элементов стоящих за максимальным элементом на минимальный элемент вектора pavel215 Паскаль, Turbo Pascal, PascalABC.NET 1 02.04.2013 14:30
Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток. Человек_Борща Общие вопросы Delphi 8 27.02.2012 23:24
Вектор С++ Наталья-1989 Помощь студентам 4 05.12.2011 09:37
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40