Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
Форумчане, прошу вас подсказать, возможно ли асинхронно выполнить некоторую функцию для каждой строки элемента DataGridView? Функция занимает довольно длительное время, причём большая часть уходит на ожидание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2014, 16:48 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
ioscat, какой источник данных у DataGridView? Или строки заполнены вручную? Нужно лишь читать данные из DataGridView или менять тоже? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2014, 18:17 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
petalvik, Вручную заполняется один столбец - IP адрес, как вариант просто читается файлик, в котором с новой строки адреса написаны, но это уже сделано, и работает хорошо работает по кнопке. В функцию передаётся значения поля строки DataGridView, функция возвращает температуру устройства, которая заносится в специальный столбец. Беда в том, что запрос идёт несколько секунд, и опрос сотни устройств выливается в несколько минут. Поэтому я попытался запускать поток для каждой строки через BeginInvoke, но, видимо, это всё же не то, что нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2014, 18:27 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
Если тот источник данных который тащит температуру может обрабатывать групповые запросы то его нужно озадачить выборкой не 1 запроса а сразу десятка или сотни. И делать это предварительно. До того как пользователь открыл грид. И кешировать по возможности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2014, 19:20 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
Мне кажется, вы меня не понимаете. Источника данных в виде базы нет. Есть программка, которая посылает запросы SNMP к устройствам по списку IP адресов, занесённых в DataGridView. На текущий момент программа делает запросы последовательно: послали первому, ждём ответ, заносим в таблицу, повторить. Можно ли распараллелить процесс опроса устройств, запуская функцию опроса для каждой строки DataGridView в отдельных потоках? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2014, 19:24 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
ioscat, работать нужно не с датагридом, а с источником данных. Этим источником может быть DataTable, List<T> или другая коллекция. А этот источник привязывается к датагриду. Так а что не так с BeginInvoke? Вероятно, вылетает эксепшен - доступ к гую из другого потока? Отсюда и следует желательность работы с привязанным источником данных. Язык C++/CLI? Или случайно не в тот раздел? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2014, 19:24 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
petalvik, 1) Visual 2010 C++ Windows Forms 2) Эксепшнов нет, всё работает штатно, вроде бы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2014, 19:26 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
Распараллелить то можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2014, 19:37 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
mayton, Что-то не так? =) Я использовал следующий код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2014, 19:58 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
Твой исходник не является для нас доказательством правильности работы самого процесса снятия температур. Фиг его знает что у тебя в runtime творится. Сделай так. Код: plaintext 1. 2. 3. 4. 5. 6. И покажи вывод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2014, 20:02 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
ioscatВот это Код: plaintext 1. запустит метод в гуевом потоке, в результате чего гуй замёрзнет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2014, 20:18 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
mayton, Я немного отклонился от вашего кода, использовал такой: Код: plaintext 1. 2. 3. 4. 5. Вывод: Start processung End processung Start processung End processung Start processung End processung Start processung End processung Start processung End processung Start processung End processung Start processung End processung Start processung End processung Start processung End processung Start processung End processung Start processung End processung Start processung End processung Start processung End processung Start processung End processung Start processung End processung ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2014, 20:23 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
petalvik, Есть подозрения, что надо не так, но как-то так рекомендуют http://msdn.microsoft.com/ru-ru/library/a06c0dc2(v=vs.110).aspx http://books.google.ru/books?id=a4vS37h3v28C&pg=PA202&lpg=PA202&dq=begininvoke c async cli&source=bl&ots=e7IIItcJIe&sig=SCtdL_c8m57GiMbJuKMKbnI3h4g&hl=ru&sa=X&ei=-96FVOnpI-aBywPJ7oHIDw&ved=0CEwQ6AEwBQ#v=onepage&q=begininvoke c async cli&f=false ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2014, 20:26 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
В алгоритме какой-то косяк? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2014, 15:57 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
ioscat, метод Control::BeginInvoke выполняет код в потоке, создавшем контрол. То есть в GUI-потоке. Поэтому в данном случае выполнение получится однопоточное и к тому же пока код выполняется, GUI не будет перерисовываться (замёрзнет). Нужно вызывать BeginInvoke на самом делегате: Код: plaintext 1. 2. А если в методе CheckString происходит изменение gui-контролов, вот тогда нужно использовать Control::BeginInvoke, иначе будет исключение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2014, 20:52 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
petalvik, вроде сработало... завтра проверю в деле... спасибо большое! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2014, 22:39 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
petalvik, спасибо, работает. Можете посоветовать, где про это можно прочитать? Предложения РЗФМ подходят, когда уже хорошо ориентируешься и самостоятельно можешь оценить полезность материала, и ещё больше, если ищешь что-то конкретное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2014, 09:34 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
ioscat, я не сразу сообразил, что такое РЗФМ. Читать, наверное, следует Асинхронная модель программирования . Боюсь что не все примеры кода есть на C++. Для .NET и WinForms лучше использовать C#. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2014, 16:50 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
Снова всем привет! А такие потоки как в моём примере после завершения отдают память системе автоматически? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2014, 10:55 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
ioscat, BeginInvoke берёт потоки из пула. После завершения работы потоки вернутся в пул. Однако, шаблон APM предполагает, что после завершения работы потока результат из него будет как-то использоваться, через IAsyncResult. В приведённом коде я этого не вижу. Меж тем, запуск потока через BeginInvoke несёт некоторый оверхед. Если нужно просто fire and forget (запустил и забыл), то лучше работать напрямую с пулом: ThreadPool::QueueUserWorkItem. Меня шибко интересует, для чего в приведённом коде использовано WaitOne? Ведь это напрочь убивает асинхронность: главный поток приложения будет ожидать, пока завершатся запущенные потоки. Если это нужно, чтобы дождаться результата вычислений, то следует использовать callback, передаваемый в BeginInvoke. Сколько всего строк в датагриде? Хотя бы примерно: десятки, сотни, тысячи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2014, 15:25 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
petalvik, Десятки. Максимум полторы сотни. Теоретический предел 10 тысяч, но этого не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2014, 19:25 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
ioscat, WaitOne используется для того, чтобы после опроса устройств записать информацию из таблицы в лог файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2014, 19:26 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
petalvikМеня шибко интересует, для чего в приведённом коде использовано WaitOne? Ведь это напрочь убивает асинхронность: главный поток приложения будет ожидать, пока завершатся запущенные потоки. Если это нужно, чтобы дождаться результата вычислений, то следует использовать callback, передаваемый в BeginInvoke. А как дождаться окончания всех потоков, используя callback? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2015, 09:30 |
|
||
|
асинхронный запуск функций для DataGridView в Windows Forms
|
|||
|---|---|---|---|
|
#18+
ioscatWaitOne используется для того, чтобы после опроса устройств записать информацию из таблицы в лог файл. ioscatА как дождаться окончания всех потоков, используя callback? Если информацию можно записывать в файл по одной строке, независимо от остальных, причём порядок их неважен (т. к. вызовы BeignInvoke будут срабатывать в произвольном порядке) то это можно делать в колбэке. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Если обязательно нужно дождаться выполнения всех опросов и/или важен порядок записи, тогда придётся дожидаться окончания всех потоков. А чтобы пользовательский интерфейс не замерзал на это время, сам метод UpdateDeviceTable нужно запускать асинхронно (в другом потоке). Что-то вроде: Код: plaintext 1. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. PS: как всё-таки уныло писать на C++/CLI после C#. Интеллисенс ни к чёрту, много лишней писанины и пр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2015, 12:23 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38828371&tid=2019126]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 157ms |

| 0 / 0 |
