Форум программистов, компьютерный форум CyberForum.ru

Потоки и выделение памяти в куче - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.74
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
30.05.2012, 10:08     Потоки и выделение памяти в куче #1
Подскажите, кто знает, какие есть тонкости при выделении памяти в куче (new) в потоках отличных от главного.
У меня возникают исключения при (или после) выделении памяти оператором new. Причём не в каком-то определённом месте а как-то хаотически (то тут, то там).
Убрал все операторы new всё заработало нормально, но такой вариант не подходит для общего случая.
VS.NET 2003.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
30.05.2012, 12:21     Потоки и выделение памяти в куче #2
А какого рода исключения? Что-то конкретное? Можно пример кода?
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
30.05.2012, 12:38  [ТС]     Потоки и выделение памяти в куче #3
Вот одна из функций (вызывается в других потоках, не в главном):
Код
void AppendEdit(CEdit *log, const TCHAR *s){
	TCHAR *text = new TCHAR[log->GetWindowTextLength()+_tcslen(s) + 1];
	log->GetWindowText(text, log->GetWindowTextLength());
	_tcscat(text, s);
	log->SetWindowText(text);
	delete text;
}
Вот сам поток:
Код
DWORD WINAPI MyThread(LPVOID lpMyStruct){
	static int count = 0;
	int current(++count);
	CMyStruct *ms = (CMyStruct *)lpMyStruct; //в ms хранится указатель на EditBox диалога созданного главным потоком

	TCHAR str[1000];

	_stprintf(str, _T("
Thread %i: started."), current);
	AppendEdit(ms->log, str);

	CThreadDialog dlg;
	if(-1 == dlg.DoModal()){
		_stprintf(str, _T("
Thread %i: Can't create dialog. %s Exit thread."), current, GetLastErrorString());
		AppendEdit(ms->log, str);
		goto end;
	}
	_stprintf(str, _T("
Thread %i: Message: %s"), current, dlg.m_text);
	AppendEdit(ms->log, str);

end:
	_stprintf(str, _T("
Thread %i: exit."), current);
	AppendEdit(ms->log, str);
	delete ms;
	return 0;
}
Исключение происходит где-то после DoModal(), но перед _stprintf()...
Output:
ERROR: Critical memory allocation from safety pool failed!
First-chance exception at 0x7c81eb33 in ThreadTest.exe: Microsoft C++ exception: CMemoryException @ 0x00f0f488.
Unhandled exception at 0x7c81eb33 in ThreadTest.exe: Microsoft C++ exception: CMemoryException @ 0x00f0f488.
и т.п.

Исключение в atltrace.h:
Код
	void __cdecl TraceV(const char *pszFileName, int nLine,
		DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFmt, va_list args) const
	{
		AtlTraceVA(m_dwModule, pszFileName, nLine, dwCategory, nLevel, pszFmt, args);
	}
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
30.05.2012, 12:46     Потоки и выделение памяти в куче #4
Твоя проблема не в выделении памяти, а в использовании DoModal. Вот здесь описывается твоя ситуация: http://www.developerfusion.co.uk/show/1715/5/

Удачи,
Владимир
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
30.05.2012, 13:32  [ТС]     Потоки и выделение памяти в куче #5
Да, я где-то читал, что с GUI в потоках есть проблемы...
Но я переписал AppendEdit() и всё теперь работает прекрасно, в т.ч. DoModal().
Код
void AppendEdit(CEdit *log, const TCHAR *s){
	//TCHAR *text = new TCHAR[log->GetWindowTextLength()+_tcslen(s) + 1];
	HANDLE hh = ::HeapCreate(0, 2000, 0);
	TCHAR *text = (TCHAR *)HeapAlloc(hh, 0, log->GetWindowTextLength()+_tcslen(s) + 1);

	log->GetWindowText(text, log->GetWindowTextLength());
	_tcscat(text, s);
	log->SetWindowText(text);

	//delete text;
	HeapFree(hh, 0, text);
	HeapDestroy(hh);
}
Т.е. для выделения/освобождения памяти я использовал функции HeapXxxxxx().

Кстати, вкратце, какие бывают потоки и чем они отличаются. Что за worker thread, UI thread и какие там ещё есть...
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
31.05.2012, 11:38     Потоки и выделение памяти в куче #6
Не уверен, что могу компетентно ответить на вопрос про различные виды потоков. Я для себя обычно различал основной поток - тот что начинает работу при запуске приложения и вспомогательные, те что в вышеупомянутой статье названы "worker thread", который создаются командой CreateThread или _beginthreadex

Для MFC приложений основной поток является UI потоком (предположение).

С уважением,
Владимир
Yandex
Объявления
31.05.2012, 11:38     Потоки и выделение памяти в куче
Ответ Создать тему
Опции темы

Текущее время: 23:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru