| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > VB6 > как правильно параллелить процессы |
| Автор: Гость_suvor 3.6.2005, 16:59 |
| Всем здравствуйте! Вот работаю я с микрофоном. То есть крутится некая апишка пишет звук в память, и "одновременно" я его обрабатываю. Возникает вопрос- как параллелить процессы. Либо пользовать в "обработчике" DoEvents-ы, либо все время его останавливать и стартовать по таймеру. Ну если по таймеру, то выходит "рывками" и код сложнее. Сделал с Events-ами. Вроде все работает, но как-то "нестабильно". Лезут такие эффекты что только ушами хлопаю! И вот я в сомнении - то ли это просто баг какой, то ли я в принципе пытаюсь достать гланды через задний проход? И далее: Если в принципе, то -а как надо -через таймер? Или может можно как-то увеличить "размер" DoEvents-а? Или может еще как? И третье: вот положим время апишке читать уровень сигнала, а система занята - что тогда? -апишка ноль запишет? или вообще пропустит? или может такого вообще не бывает?(может она мимо процессора работает?) -я понимаю что наверняка навряд кто знает, но все же какие мнения? |
| Автор: cardinal 3.6.2005, 20:42 | ||
Никак. Ты можешь только переключаться между процессами. И таким образом создавать имитацию того, что они выполняются параллельно. То есть тебе надо придумать способ переключения между твоими процессами. Ты можешь создавать потоки, между которыми твоя ОС будет автоматом переключаться, но для этого тебе надо писать на чем угодно, но не на VB. Если честно я пока не очень понял, что ты делаешь (и чем тебя не устраивает DoEvents) поэтому больше ничего сказать не могу... |
| Автор: Vach 3.6.2005, 21:21 |
| 2Гость_suvor http://www.planetsourcecode.com с верху есть "Quick Search for" >> Multi threading "in language" >> Visual Basic. Найди чтото вроде "Multi Threading in VB6" или чтото типа того... Мало - иди в гугли. ЗЫ Работать вроде будет НО! отладка тебя доканает (только коректный выход и никаких остановок - всё валится). Подумай может тебе DoEvents хватит? Удачи. |
| Автор: Guest 4.6.2005, 07:33 |
| Cardinal-у: Не, я наверно спросил очень непонятно! -Я понимаю что физической параллельности процессов нет (хотя может апишка может работать с аудиокартой без постоянного участия процессора?) Но далее. В рамках VB я вижу два способа дать время апишке на работу - или вставить DoEvents в обработчика или завершить его, а потом перевызвать по таймеру. И оба в общем работают. Я сделал с DoEvents. Но похоже что DoEvents дает системе слишком короткую передышку в результате чего лезут разные глюки (например апишке надо все время подсовывать память а это получается через раз! -видимо не успевает что-то там завершаться). И вот теперь я в сомнении -или переделать все на использование таймера (а там могут свои проблемы быть)или это без разницы? То есть вопрос не в том как вообще сделать, а как сделать правильно, что бы потом при развитии обработчика эти геморрои уже не доставали! Потому как ведь часто бывает, что вроде все работает, а на самом деле в соседнюю квартиру через Владивосток посылаешь! И потом это все аукается. Vach-у: спасибо, попробую посмотреть, хотя звучит все страшновато. |
| Автор: efedron 4.6.2005, 10:50 |
| ты хотя бы кусок кода выложил, чтоб людям можно было поэксперементировать |
| Автор: Voldemar2004 4.6.2005, 16:35 | ||||||||||||
Если не жалко, скажи какая АПИ-шка. И можно ли записывать с линейного входа звуковой карты, или это в VB никак не прет? (С микрофона у меня тож примерчик есть - DirectX). А то у всех кого можно спрашиваю, во многих книжках приведены примеры записи с микрофона - а с Line-In - хоть головой об монитор, - нету.
Ага. Я когда в своей проге дохожу до финализации результирующего звукового файла, то приходится делать дополнительное время ожидания 3 секунды. Иначе возможны такие тормоза - ой-ой-ой.
Ну так, можно же при запуске твоей проги сделать приоритет всех остальных активных прог самым низким (если конечно не жалко:)). А приоритет твоей проги повысить. А в крайнем случае кэшировать в файл то, что записываешь в память, ну и обновлять (дописывать в этот файл) через регулярные промежутки времени. Такая технология реализована в Sound Forge например.
Не понял. ОС виндоус же мультизадачная, так процессов там полно работающих параллельно. Может Гость_suvor имеет в виду выделять им равные приоритеты работы ЦП: 2 процесса - 50% первому 50% второму процессу. Ну так это ж нереально просчитать (ЦП то у всех разные по производительности). Или Гость_suvor хотел один процесс разделить на 2 (3/4 и т.д.)? А?
Это как? ЦП всегда необходим для работы с любой железкой, пусть и загружен на 1%. |
| Автор: Gannibal 4.6.2005, 16:55 |
| попробуй в буффер записывать а потом из буффера обрабатывать а во второй буффер опять записывать вот может пример подтолкнёт на мысль http://bbs.vbstreets.ru/viewtopic.php?p=14139#14139 там посмотри в два буффера записывать .. если так взять то можно с одного обрабатывать сразу а в другой писать// |
| Автор: Guest 5.6.2005, 17:29 |
| 1. Апишек там цельный выодок -waveInOpen, waveInStart, WaveInPrepareHeader, WaveInAddBuffer... 2. Насчет линейного входа -понятия не имею. Могу только заметить, что микрофон работает как пассивный, так и активный (с батарейкой). Да и разьемы одинаковые. Так что может линейный вход и не актуален? 3. Насчет приоритета - ну меня же не другие задачи волнуют (хотя может и зря) а конкуренция моей же апишки которая звук принимает и моего же обработчика. Так что причем тут приоритеты я не понял. 5. Я может неграмотно слово процесс употребил что породило непонимание. -Работает мной же запущенная апишка и мой же обработчик. Не знаю процессы это или нет но Вопрос в том как грамотнее апишке дать время подышать- закрывая на время обработчик и потом открывая по таймеру или с помощью DoEvents. Вопрос то мне казался не слишком специфичным и я думал на него просто есть однозначный ответ. 6. ЦП то конечно необходим, но все ли время? Почему бы аудиокарте не иметь свою память и не писать туда сбрасывая в оперативную только когда система освободится? Именно это я имел в виду. То есть я понятия не имею так ли это. но почему бы нет? 7. Два буфера- хорошо, но не в том проблема. Трудность с подсовыванием памяти я привел как пример эффектов конкуренции. А так я действительно поставил перед вызовом цикл в 5000 DoEventsov и все тип топ. |