Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Асинхронный вызов функций
|
|||
|---|---|---|---|
|
#18+
народ, никто не знает как можно вызвать асинхронно какую-либо произвольную функцию? я сейчас выкрутился через CreateThread, но может это не совсем правильно? и у windows существуют специализированные механизмы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2003, 04:21 |
|
||
|
Асинхронный вызов функций
|
|||
|---|---|---|---|
|
#18+
что бы что? я про такое не слышал. скорее всего нету, потому что есть потоки, они позволяют такое. по сути, поток это и есть асинхронный вызов функции. только параметры функции не задаются, к сожалению. а то можно былобы в createthread передать указатель на api функцию. к стати, подумай над этим. есть определенный набор функций, которые имеют на входе инт32(или указатель, что одно и тоже в данном случае). их можно запускать на выполнение через createthread :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2003, 05:17 |
|
||
|
Асинхронный вызов функций
|
|||
|---|---|---|---|
|
#18+
почему нет параметров у функции потока? Есть и более того она может возвращать результат. Возвращает и принимает значение integer. А его можно конвертировать в указатель на структуру и в ней какие угодно параметры возможны. Я и сделал через потоки, но мне это не очень нравится. При старте потока откушивается стек, создается контекст потока и еще куча остальных вещей необходимых для многопоточника, но без которых можно было бы обойтись если бы это отрабатывала какая-то функция ядра в своем контексте. В тоже время функция записи в файл работает асинхронно, функция sndPlaySound может работать в асинхронном режиме. Вот мне и хочится свою функцию запускать асинхронно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2003, 08:31 |
|
||
|
Асинхронный вызов функций
|
|||
|---|---|---|---|
|
#18+
Если у Вас при старте и только при старте программы создается конечное и не очень большое количество дополнительных потоков, то это нормально. Потоки создались, они работают - это нормально. Если какой-то из них вызывает функцию ожидания, sleep, ... то при нехватке памяти система переместит некоторые страницы памяти этого потока в своп. Это тоже нормально. Главное, чтобы этот поток проснулся именно тогда когда в нем возникнет необходимость, а не через каждые полсекунды как в этом примере: Код: plaintext 1. 2. 3. 4. 5. 6. А вот если на каждый чих создаете отдельный поток, то это уже ненормально. Единственный правильный выход - грамотно спроектировать логику работы Вашей программы. Кстати, для чего Вам нужно асинхронное выполнение функций? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2003, 12:59 |
|
||
|
Асинхронный вызов функций
|
|||
|---|---|---|---|
|
#18+
Вот я и чувствую не нормально это... асинхронно мне нужно например вывести сообщение для юзера (MessageBox) или произнести фразу через speech. Это то что требуется сейчас. В винде вроде ка упоминается очередь асинхронных вызовов, но вот как ее заюзать, я пока не нашел... Как вариант можно конечно нарисавать свою подобную очередь, но зачем изобретать велосипед, если это уже есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2003, 03:34 |
|
||
|
Асинхронный вызов функций
|
|||
|---|---|---|---|
|
#18+
Насколько я знаю, общего механизма для того, чтобы ЛЮБАЯ функция могла быть вызвана асинхрнонно нет. В Win98 точно. В NTDLL может быть и есть возможность вызвать что-то асинхрнонно, там много чего недокументированного. Но нужно же писать стандартный код (для разных платформ). В Microsoft видимо оценили, для каких функций может возникнуть потребность асинхрнонного выполнения. Кстати, а как вы думаете выполняются асинхрнонные функции. Очевидно только на основе многопоточности. И почему при необходимости не создать поток? Вроде бы нет в этом ничего полхого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2003, 23:41 |
|
||
|
Асинхронный вызов функций
|
|||
|---|---|---|---|
|
#18+
плохо то, что поток создается-удаляется постоянно... происходит постоянное передергивание памяти (как минимум надо разместить где-то стек), В менеджере задач то появляется то исчезает объект... мне всеж кажется что это не есть гуд... Если появятся еще процедуры для асинхронного вызова в проекте, придется наверное писать поток, который будет обрабатывать все процедуры в своем теле... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2003, 03:30 |
|
||
|
Асинхронный вызов функций
|
|||
|---|---|---|---|
|
#18+
В приложении может быть произвольное количество потоков, это нормально и именно это подразумевается идеологией Windows. В их создании/закрытии также нет ничего криминального. Помните, что поток и процесс - это две разные вещи, поток кушает не так много ресурсов. Размер стека Вы указываете сами. А любая асинхронность windows есть та же самая работа с потоками, только вынесенная в ОС. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2003, 07:38 |
|
||
|
Асинхронный вызов функций
|
|||
|---|---|---|---|
|
#18+
только не надо мне про потоки рассказывать ) это я вроде как освоил настолько чтобы писать безглючное приложение мне именно и хочется чтобы асинхронностью рулила винда, потому как я думаю от этого эффективность и устойивость повысится... сам по себе поток это нормально, но вот постоянный старт и разрушение, мне кажется это через чур... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2003, 08:20 |
|
||
|
Асинхронный вызов функций
|
|||
|---|---|---|---|
|
#18+
Ну и что вы спорите? ЛЮБАЯ АССИНХРОННАЯ ФУНКЦИЯ ПОРОЖДАЕТ ОТДЕЛЬНЫЙ ПОТОК. Если она действительно АССИНХРОННАЯ, то есть, выполняется отдельно от остальных. Вопрос лиш в том, кто будет этот поток порождать, либо вы сами, либо ядро ОС. О последнем как раз и спрашивает StarWind. Только я не вижу принципиальной разницы, поскольку расходование ресурсов будет одним и тем же (с небольшими изменениями). А тот варинат, когда в начале создано некотоое количество потоков, на самом деле не будет полностью ассинхронным. Там будет ассинхронность только между потоком основой программы (по сути функции - обработчика сообщений главного окна программы), и тех функций, которые запущены из других потоков. Но те функции, которые запускаются изнутри одного потока по отношению друг к другу не будут ассинхронными. И даже если в ядре ОС есть та возможность, о которой спрашивает StarWind, то от обычного потока она будет отличаться только тем, что ядро свои потоки обычно в менеджере задач не отображает. А в остальном, если это действительно ассинхронный вызов, ему всё равно нужно создавать контекст процесса, то бишь , выделять память под сохранение состояния ЦП и вписывать в общий список тех процессов, между которыми ЦП будет переключаться. А иначе сы ассинхронной работы не получим. Ну либо использовать имитацию многозадачности, как это было в ранних версиях Windows. Только этот способ на самом деле работает ЕЩЁ МЕДЛЕННЕЕ, поскольку тогда переключение между потоками будет выполняться олностью программно, в то время как в семействе NT переключение между потоками до некоторой степени выполняется аппаратно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2003, 09:31 |
|
||
|
Асинхронный вызов функций
|
|||
|---|---|---|---|
|
#18+
И ещё, при работе с потоками нужно не забывать о синхронизации при работе с общими данными. То есть, просто так преобразовывать int32 в указаетли, конечно, можно. Но если не использовать синхронизацию, то можно получить такие глюки, что найти их будет очень тяжело. Например один процесс считал данные для обработки, потом произошло перключение между процессами, те же данные считал дургой, потом снова переключение, первый сохранил результат, потом снова переключение, и второй процесс перезаписал только что сохранённый результат первого процесса. Потом опять переключение и первый процесс снова обращается к этим данным, а там уже результат от второго процесса. :) И в итоге у программиста начинает ехать крыша, поскольку вроде бы всё написано правильно, а программа непонятно что и откуда взяла и что-то такое странное на выходе выдала. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2003, 09:37 |
|
||
|
Асинхронный вызов функций
|
|||
|---|---|---|---|
|
#18+
понятно.... Нужно будет просто нарисовать объект, который будет работать в отдельном потоке и принимать функции на исполнение из очереди... Для меня этого будет достаточно, да и передергиваний менеджера потоков не будет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 03:19 |
|
||
|
Асинхронный вызов функций
|
|||
|---|---|---|---|
|
#18+
народ, а вот тут если кому надо я нашел как можно подобное реализовать и более того тут очень много всего интересного расписано... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 08:35 |
|
||
|
Асинхронный вызов функций
|
|||
|---|---|---|---|
|
#18+
Кстати, я сильно подозреваю, что для того чтобы вывести этот самый MessageBox или проговорить фразу, все равно потребуется синхронизация с основным потоком - что сведет эту асинхронность к нулю. Подозрение основано на том, что все вызовы VCL не являются thread-safe - и неспроста. Nobody faults but mine... (LZ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 13:03 |
|
||
|
Асинхронный вызов функций
|
|||
|---|---|---|---|
|
#18+
Как раз с MessageBox проблем не будет, потому как можно использовать его из WinAPI. Но, кстати, вообще-то самым простым вариантом было бы сделать свой modeless MessageBox и не озадачиваться трэдами :-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 14:46 |
|
||
|
Асинхронный вызов функций
|
|||
|---|---|---|---|
|
#18+
произношение фраз и показ сообщения осуществляется не средствами VCL... А написать свое MessageBox... можно конечно, но вознкнет вопрос с произношением, да и эти функции можно назвать лишь некой прелюдией и тренировками... Остальные будут несколько сложнее :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2004, 03:11 |
|
||
|
|

start [/forum/topic.php?fid=58&gotonew=1&tid=2115233]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
11ms |
get first new msg: |
6ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 244ms |
| total: | 403ms |

| 0 / 0 |
