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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2013, 15:32   #1
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
Восклицание Ошибка при выполнении программы

Код:
MCIERROR SendWaveAudioMCICommand(LPCSTR command)
{
	CString cmd;
	MCIERROR res;
	cmd.Format("%s %s", command, TEMP_SOUND_PATH);

	mciSendString("open waveaudio shareable", NULL, 0 , NULL);
	res = mciSendString(cmd, NULL, 0 , NULL);
	mciSendString("close waveaudio", NULL, 0 , NULL);
	return res;
}

void CFreelancerEditorDlg::PlayUTFSound(HTREEITEM hItem)
{
	if(hItem != NULL)
	{
		if(!TreeView.ItemHasChildren(hItem) && hItem != TreeView.GetRootItem())
		{
			HTREEITEMINFO* hInfo = TreeView.GetItemInfo(hItem);

			SendWaveAudioMCICommand("Stop");

			FILE* sound;
			fopen_s(&sound, TEMP_SOUND_PATH, "wb");
			fwrite(hInfo->DstBuf, hInfo->nDataSize1, 1, sound);
			fclose(sound);

			SendWaveAudioMCICommand("Play");

			IsSoundPlaying = TRUE;
			SetDlgItemText(IDC_WAVE_NAME, TreeView.GetItemText(hItem));
		}
	}
}
Вызов функции PlayUTFSound(), происходит при нажатии кнопки. Все вроде-бы работает нормально, но вот если нажимать кнопку очень быстро, то получаем ошибку:
Debug Assertion Filed
Exception (stream != NULL)
Как я предполагаю, ошибка происходит при создании файла... Но вот не совсем понимаю как это исправить.

Последний раз редактировалось crymchanin; 20.01.2013 в 16:06.
crymchanin вне форума Ответить с цитированием
Старый 21.01.2013, 01:23   #2
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

Ни у кого нет никаких предложений?
crymchanin вне форума Ответить с цитированием
Старый 21.01.2013, 02:15   #3
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

мсдн писала:
Цитата:
Files opened by fopen_s and _wfopen_s are not sharable. If you require that a file be sharable, use _fsopen, _wfsopen with the appropriate sharing mode constant (for example, _SH_DENYNO for read/write sharing).
Видимо команда mciSendString("close waveaudio" работает асинхронно с текущим потоком, и файл не успевает закрыться к тому моменту, как идет вызов fopen_s.
Но это только предположение.

Последний раз редактировалось EUGY; 21.01.2013 в 02:20.
EUGY вне форума Ответить с цитированием
Старый 21.01.2013, 08:35   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Так вы не торопитесь нажимать. Там же работа с диском ... а она не может происходить с той скоростью с которой вы на экране информацию видите.
Сделайте задержку при нажатии кнопки, либо отлов ошибки и автоматическое определение задержки. через try catch
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 21.01.2013, 08:58   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Так вы не торопитесь нажимать.
Все бы ничего, да поди это объясни потребителям... Раз такая проблема, лучше всего завести флаг закончилась обработка или нет и если будет нажатие до завершения, тогда ничего не делать.
waleri вне форума Ответить с цитированием
Старый 21.01.2013, 09:32   #6
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Правильно... блокируйте кнопку пока не завершится процесс.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 21.01.2013, 09:49   #7
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Надо бы покапаться в командах, может есть что-то типа
"close waveaudio wait"
EUGY вне форума Ответить с цитированием
Старый 22.01.2013, 12:20   #8
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

воспроизведение не должно вешать основной поток... вы должны делать новый поток... и если поток существует... либо не воспроизводить либо воиспроизвести на новом... получиться что то вроде в играх... там стреляют тут орут.. там на части режут и жрут.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 30.01.2013, 15:37   #9
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

Спасибо всем за внимание. Проблему решил. Просто проверяю контрольные суммы CRC32 файла - если они совпадают, то файл не перезаписывается.
crymchanin вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка при выполнении программы ST@LKER Общие вопросы C/C++ 8 03.12.2011 22:38
(pascal) Ошибка при выполнении программы IvaN9900 Помощь студентам 8 25.11.2011 12:47
Ошибка при выполнении программы Гурам Общие вопросы Delphi 1 18.11.2010 18:53
При выполнении программы ошибка. Cyber Помощь студентам 12 02.10.2010 17:16
критическая ошибка при выполнении программы Познающий Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 18.11.2009 16:51