|
|
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
Связи с внедрением многоядерности вопрос: как можно параллелить код програмы на фоксе на нити для разбрасывания нитей по процессорам, чтоб параллельный код мог выполняться быстрее. Например: Цикл 1 Цикл 2 Цикл 3 Все циклы независимы по данным и я хочу запустить циклы 1 и 2 в отдельных потоках и сразу начать выполнения цикла 3, затем подождать результатов первых 2-х потоков и выполнять програму дальше. Можно ли на фоксе выполнить что-то типа CreateThread или тому подобное. То-есть цель: есть некий код на фоксе и я хочу запустить его отдельным потоком (асинхронно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2006, 00:01 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
Никак ! Фокс - Однопоточный!!! А что много ядер в проце -так это еще ни одна операционка толком не поддерживает - кроме серверных. Хотя можно попробовать через запуск нескольких экземпяров фокса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2006, 09:17 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
В "VFP Advisor" что-то было на эту тему. http://msvfp.advisorguide.com/doc/16965 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2006, 10:00 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
5631 спасибо за ссылку. ser60, это я и имел в виду запускать отдельный асинхонный поток, в крайнем случае приложение или процесс vfp, а оперционка (windows) вроде бы сама должна разбрасывать интенсивно выполняющиеся потоки на разные CPU. В крайнем случае можно поискать в winapi как задать потоку afinity (то что можно сделать в task manager, при клике на процессе на многопроцессороной машине) принудительно разбрасывать по CPU. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2006, 01:09 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
Появилось еще что-то. http://www.gotdotnet.com/codegallery/codegallery.aspx?id=8605c6c5-0a4a-4636-a3c7-d5178dad77ac ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2006, 19:19 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
Я такие вещи делаю через IDispatch _vfp.Application в FLL, приводя его к ApplicationPtr. Только пока не научился делать универсально для всех версий VFP, но если напишите какая версия фокса у Вас, то легко смогу помочь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2006, 21:47 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток! Как вариант, организовать многопоточность (правда под VFP 9.0 почему-то приоритет потока всегда равен приоритету процесса его запустившего даже если его насильно менять, толи потому что без SP, то ли еще что-нибудь, история об этом умалчивает) можно так: Код: 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. Имена функций (главной функции выполняемой в потоке ( и функций уведомителей могут быть произвольными ,длинной не более 16 байт. Имя массива передаваемого по ссылке в качетве параметра может быть произвольным. Главное не ошибайтесь в наименовании описания функций при описании и присвоении этого имени в массив. Удачи. P.S: По уму настоящую многопоточность в VFP оргнизовать можно используя COM EXE, но это отдельная и долгая тема. И кстати, почему еще никто не догадался написать контрол OLE Automation обеспечивающий многопоточность в VFP. Странно. Мелкомягкие , зная проблему погли бы и подъсуетиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 23:06 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
Hex 00И кстати, почему еще никто не догадался написать контрол OLE Automation обеспечивающий многопоточность в VFP. Странно. Мелкомягкие , зная проблему погли бы и подъсуетиться. Все это есть, но за деньги. Посмотрите через Google... Есть даже программы, которые очень корректно изолируют запущенные процессы FoxPro (используются на серверах провайдеров, предоставляющие хостинг, где можно использовать FoxPro в качестве Web приложения), причем задач запускается довольно много и если какая-то умирает, то успешно и чисто удаляется из памяти... Чего только не написано для FoxPro Microsoft же этого не включает в очередную версию FoxPro по экономико - политическим причинам (на мой скромный взгляд)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 23:47 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
Кстати, забыл выложить библу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 23:51 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
Hex 00Доброго времени суток! Как вариант, организовать многопоточность (правда под VFP 9.0 почему-то приоритет потока всегда равен приоритету процесса его запустившего даже если его насильно менять, толи потому что без SP, то ли еще что-нибудь, история об этом умалчивает) можно так: Код: 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. Имена функций (главной функции выполняемой в потоке ( и функций уведомителей могут быть произвольными ,длинной не более 16 байт. Имя массива передаваемого по ссылке в качетве параметра может быть произвольным. Главное не ошибайтесь в наименовании описания функций при описании и присвоении этого имени в массив. Удачи. P.S: По уму настоящую многопоточность в VFP оргнизовать можно используя COM EXE, но это отдельная и долгая тема. И кстати, почему еще никто не догадался написать контрол OLE Automation обеспечивающий многопоточность в VFP. Странно. Мелкомягкие , зная проблему погли бы и подъсуетиться. Внимательн перчитав код, могу предположить следущее: Чтоб запаралелить 2 цикла нужно сделать примерно такое: Public giSUM1 As Integer STORE 0 TO giSUM1 PUBLIC ARRAY Prm1(5) && Масиив для параметров PUBLIC ARRAY Prm2(5) && Масиив для параметров Prm1(1) = "TreadFn1()" && Процедура которая выполнится в потоке (всегда 1) Prm1(2) = "TreadStart1()" && Процедура уведомления начала запуска потока (всегда 2) Prm1(3) = "TreadStop1()" && Процедура уведомления окончания выполнения потока (всегда 3) Prm1(4) = Sys(3095,_vfp) && IDispatch VFP (всегда 4) Prm1(5) = THREAD_PRIORITY_IDLE && Приоритет потока всегда (5) Prm2(1) = "TreadFn2()" && Процедура которая выполнится в потоке (всегда 1) Prm2(2) = "TreadStart2()" && Процедура уведомления начала запуска потока (всегда 2) Prm2(3) = "TreadStop2()" && Процедура уведомления окончания выполнения потока (всегда 3) Prm2(4) = Sys(3095,_vfp) && IDispatch VFP (всегда 4) Prm2(5) = THREAD_PRIORITY_IDLE && Приоритет потока всегда (5) ? THREADCMD(@Prm1) Procedure TreadFn1() LOCAL I FOR I = 1 TO 1000 GISUM1 = GISUM1+I ? GISUM1 DOEVENTS ENDFOR ? GISUM1 Endproc Procedure TreadStart1() * Тут ваш код перед обработкой потока ? "Начало вычислений" Endproc Procedure TreadStop1() * Тут ваш код после отработки потока ? "Окончание вычислений", ' ', giSUM1 Endproc ************************************ Procedure TreadFn2() LOCAL I FOR I = 1 TO 1000 GISUM1 = GISUM1+I ? GISUM1 DOEVENTS ENDFOR ? GISUM1 Endproc Procedure TreadStart2() * Тут ваш код перед обработкой потока ? "Начало вычислений" Endproc Procedure TreadStop2() * Тут ваш код после отработки потока ? "Окончание вычислений", ' ', giSUM1 Endproc Я правильно вразумел???? [/src] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2006, 21:49 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
Да. Только поиграй с THREAD_PRIORITY как тебе удобно и незабудь настроить это: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2006, 22:05 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
Да и во втором потоке не GISUM1, а что-то другое, а-то результат будет неправильный и при доступе к 1 переменной из разных потоков просто в лоб нельзя обращаться, нужно использовать блокирующие функции или сихронизацию на уровне объектов ядра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2006, 22:07 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
Hi Hex 00! > P.S: По уму настоящую многопоточность в VFP оргнизовать можно используя > COM EXE, но это отдельная и долгая тема. COM DLL, причём multithreaded - и тема это не такая уж и сложная и длинная - есть для этого ActiveX контрол VFPMTApp.dll - неоднократно кстати упоминавшийся и на этом форуме и на других... > И кстати, почему еще никто не догадался написать контрол OLE Automation > обеспечивающий многопоточность в VFP. Странно. Мелкомягкие , зная проблему > погли бы и подъсуетиться. Зачем, если он уже давно сделан (не в MS) - кажись ещё под 6-ю версию фокса есть вариант... Кроме того совсем недавно в своём блоге Calvin Hsia нарисовал более примитивный код (ассемблерный, загружаемый в память процесса как фоксовая строка :) ) позволяющий выполнить примерно то-же самое - т.е. запустить фоксовый код в новом потоке - конечно тоже при помощи многопоточного рантайма vfpXt.dll - ибо однопоточный рантайм не рассчитан на такие издевательства :) Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 17:53 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
Привет Igor ! Видел я код Calvin Hsia и имею исходники FPMTApp.dll. В первом случае человек просто всем врет ( кто же его пустит на 1 уровен колца защиты, как я понял было скопировано из BIN под DOS , а понятия о том что защищенный режим никога не выполнит код без явного определения сегмента кода и данных в таблице LTD и ссылку на GTD нет), во втором глюков и гемороя выделения кучи и управления сложными вложенными структурами как минимум не для исползования в фоксе , а для подтверждения своей крутизны. И Вы это пректрасно понимаете и сами видите. То , что предложил я( с маленкой буквы ), просто, доступно, работает, реализация проста как отбойный молоток. Это минимум того что можно реализовать. Удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 23:08 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
Здраствуюте Всем и Hex 00! Я скачал vfpThread.fll и эта fll работат не хочет,у меня VFP9 SP1(Visual FoxPro 09.00.0000.3504 for Windows),Library file vfpThread.fll is invalid. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 23:58 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
puls, а у меня уже год работает на 20 инсталах. Как Вы это можете объяснить ? И никакакая она ни инвалид. Нормальная библа, отлаженная мной и клиентами. Странно все это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2006, 00:18 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
to Hex00: поделитесь пожалуйста опытом использования описанного подхода. к примеру: на каких типах процессора тестировалось ,какие версии ОС использовались, какие результаты производительности и на каких объемах данных, часто ли возникают проблемы с локами и простой потоков и т.д. как мне кажется, поднятая тема интересна многим и отвечает современным тенденциям ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2006, 13:14 |
|
||
|
VFP9SP1 и многопоточный код
|
|||
|---|---|---|---|
|
#18+
Hi Hex 00! > В первом случае человек просто всем врет ( кто же его пустит на 1 уровен > колца защиты, как я понял было скопировано из BIN под DOS , а понятия о > том что защищенный режим никога не выполнит код без явного определения > сегмента кода и данных в таблице LTD и ссылку на GTD нет), Ну врать всем невозможно :) И тем более человеку хорошо знакомому с C++ - по крайней мере сам фокс он как-то умудряется писать :) Вообще-то его код вполне работоспособен на не очень свежих процессорах и ОСях. Никакого Ring0 там нет да и не требуется, и работы с сегментными таблицами тоже нет и не требуется (он вообще из heap память берёт) - единственное что нужно было бы "для общности" - так это вместо heap использовать VirtualAllocEx c явным указанием режима защиты PAGE_EXECUTE_READWRITE - тогда уже всё было-бы совсем "по честному". Уж не знаю почему он так не сделал - ведь сам же когда-то писал про сложности, возникающие с самим фоксом при работе на машинах поддерживающих аппаратную "защиту DEP" - т.е. предотвращающих исполнение кода в сегменте не имеющем соответстующей привилегии... А фокс кое где этим и занимается - т.е. генерит на лету машинный код и исполняет его. > во втором глюков и гемороя выделения кучи и управления сложными вложенными > структурами как минимум не для исползования в фоксе Не знаю, если ты именно про ту самую dll-ку, то я не увидел там никакой особой крутизны, все решения более чем "прозрачны" (хотя сама идея очень интересна - и если именно Remus Rusanu эту идею выдвинул - то большой респект ему за это) - реально я её не использовал (не было нужды) - но не думаю что "идеологически" можно придумать что-то сильно лучшее. А вопрос реализации уже не столь важен - вот и Rick Strahl пишет в коментах что на ..NET нарисовал свой вариант такого универсального многопоточного "вызывальщика" COM-ов... > То , что предложил я( с маленкой буквы ), просто, доступно, работает, > реализация проста как отбойный молоток. Ну тут надо смотреть исходник и/или тестировать на своих задачах (то что одному кажется каменно стабильным и надёжным, у другого постоянно падает и не работает как задумывалось - это не в упрёк, просто так оно обычно в жизни бывает - отходишь на шажок в сторону от "продуманного и проверенного" варианта использования и тут-же получаешь по башке :( А автор потом долго удивляется - как же это можно было додуматься до этакого вот хитрого/нестандартного варианта... Даже хорошая вещь типа TestUnit Framework тут не спасает - хотя уже выявленную проблему наверняка можно довольно быстро исправить). Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2006, 02:02 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33693323&tid=1591498]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 483ms |

| 0 / 0 |
