powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / VFP9SP1 и многопоточный код
18 сообщений из 18, страница 1 из 1
VFP9SP1 и многопоточный код
    #33693074
mal_ora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Связи с внедрением многоядерности вопрос: как можно параллелить код програмы на фоксе на нити для разбрасывания нитей по процессорам, чтоб параллельный код мог выполняться быстрее. Например:
Цикл 1
Цикл 2
Цикл 3
Все циклы независимы по данным и я хочу запустить циклы 1 и 2 в отдельных потоках и сразу начать выполнения цикла 3, затем подождать результатов первых 2-х потоков и выполнять програму дальше. Можно ли на фоксе выполнить что-то типа CreateThread или тому подобное. То-есть цель: есть некий код на фоксе и я хочу запустить его отдельным потоком (асинхронно).
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33693323
ser60
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никак ! Фокс - Однопоточный!!! А что много ядер в проце -так это еще ни одна операционка толком не поддерживает - кроме серверных.
Хотя можно попробовать через запуск нескольких экземпяров фокса.
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33693423
5631
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В "VFP Advisor" что-то было на эту тему.
http://msvfp.advisorguide.com/doc/16965
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33696068
mal_ora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5631 спасибо за ссылку.

ser60, это я и имел в виду запускать отдельный асинхонный поток, в крайнем случае приложение или процесс vfp, а оперционка (windows) вроде бы сама должна разбрасывать интенсивно выполняющиеся потоки на разные CPU. В крайнем случае можно поискать в winapi как задать потоку afinity (то что можно сделать в task manager, при клике на процессе на многопроцессороной машине) принудительно разбрасывать по CPU.
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33746711
5631
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Появилось еще что-то.
http://www.gotdotnet.com/codegallery/codegallery.aspx?id=8605c6c5-0a4a-4636-a3c7-d5178dad77ac
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33746873
Hex 00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я такие вещи делаю через IDispatch _vfp.Application в FLL, приводя его к ApplicationPtr. Только пока не научился делать универсально для всех версий VFP, но если напишите какая версия фокса у Вас, то легко смогу помочь.
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33755603
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.
Set Library To vfpThread.fll

#define THREAD_PRIORITY_TIME_CRITICAL  0 
#define THREAD_PRIORITY_HIGHEST           1 
#define THREAD_PRIORITY_ABOVE_NORMAL  2 
#define THREAD_PRIORITY_NORMAL             3 
#define THREAD_PRIORITY_BELOW_NORMAL  4 
#define THREAD_PRIORITY_LOWEST            5 
#define THREAD_PRIORITY_ABOVE_IDLE       6 
#define THREAD_PRIORITY_IDLE                  7 

Public giSUM1 As Integer
STORE  0  TO giSUM1

PUBLIC ARRAY  Prm1( 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 )

? 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

Имена функций (главной функции выполняемой в потоке ( и функций уведомителей могут быть произвольными
,длинной не более 16 байт. Имя массива передаваемого по ссылке в качетве параметра может быть произвольным.
Главное не ошибайтесь в наименовании описания функций при описании и присвоении этого имени в массив.
Удачи.
P.S: По уму настоящую многопоточность в VFP оргнизовать можно используя COM EXE, но это отдельная и долгая тема.

И кстати, почему еще никто не догадался написать контрол OLE Automation обеспечивающий многопоточность в VFP. Странно. Мелкомягкие , зная проблему погли бы и подъсуетиться.
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33755639
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hex 00И кстати, почему еще никто не догадался написать контрол OLE Automation обеспечивающий многопоточность в VFP. Странно. Мелкомягкие , зная проблему погли бы и подъсуетиться.
Все это есть, но за деньги. Посмотрите через Google...

Есть даже программы, которые очень корректно изолируют запущенные процессы FoxPro (используются на серверах провайдеров, предоставляющие хостинг, где можно использовать FoxPro в качестве Web приложения), причем задач запускается довольно много и если какая-то умирает, то успешно и чисто удаляется из памяти...

Чего только не написано для FoxPro

Microsoft же этого не включает в очередную версию FoxPro по экономико - политическим причинам (на мой скромный взгляд)...
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33755641
Hex 00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, забыл выложить библу.
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33756312
Valerii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
Set Library To vfpThread.fll

#define THREAD_PRIORITY_TIME_CRITICAL  0 
#define THREAD_PRIORITY_HIGHEST           1 
#define THREAD_PRIORITY_ABOVE_NORMAL  2 
#define THREAD_PRIORITY_NORMAL             3 
#define THREAD_PRIORITY_BELOW_NORMAL  4 
#define THREAD_PRIORITY_LOWEST            5 
#define THREAD_PRIORITY_ABOVE_IDLE       6 
#define THREAD_PRIORITY_IDLE                  7 

Public giSUM1 As Integer
STORE  0  TO giSUM1

PUBLIC ARRAY  Prm1( 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 )

? 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

Имена функций (главной функции выполняемой в потоке ( и функций уведомителей могут быть произвольными
,длинной не более 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]
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33756331
Hex 00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да.
Только поиграй с THREAD_PRIORITY как тебе удобно и незабудь настроить это:
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33756336
Hex 00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и во втором потоке не GISUM1, а что-то другое, а-то результат будет неправильный и при доступе к 1 переменной из разных потоков просто в лоб нельзя обращаться, нужно использовать блокирующие функции или сихронизацию на уровне объектов ядра.
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33766947
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33767460
Hex 00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет Igor !
Видел я код Calvin Hsia и имею исходники FPMTApp.dll. В первом случае человек просто всем врет ( кто же его пустит на 1 уровен колца защиты, как я понял было скопировано из BIN под DOS , а понятия о том что защищенный режим никога не выполнит код без явного определения сегмента кода и данных в таблице LTD и ссылку на GTD нет), во втором глюков и гемороя выделения кучи и управления сложными вложенными структурами как минимум не для исползования в фоксе , а для подтверждения своей крутизны. И Вы это пректрасно понимаете и сами видите. То , что предложил я( с маленкой буквы ), просто, доступно, работает, реализация проста как отбойный молоток.
Это минимум того что можно реализовать.
Удачи.
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33767518
puls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здраствуюте Всем и Hex 00!
Я скачал vfpThread.fll и эта fll работат не хочет,у меня VFP9 SP1(Visual FoxPro 09.00.0000.3504 for Windows),Library file vfpThread.fll is invalid.
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33767523
Hex 00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
puls, а у меня уже год работает на 20 инсталах. Как Вы это можете объяснить ? И никакакая она ни инвалид. Нормальная библа, отлаженная мной и клиентами.
Странно все это.
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33768564
foxuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Hex00:

поделитесь пожалуйста опытом использования описанного подхода.
к примеру: на каких типах процессора тестировалось ,какие версии ОС использовались, какие результаты производительности и на каких объемах данных, часто ли возникают проблемы с локами и простой потоков и т.д.

как мне кажется, поднятая тема интересна многим и отвечает современным тенденциям ;-)
...
Рейтинг: 0 / 0
VFP9SP1 и многопоточный код
    #33770270
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / VFP9SP1 и многопоточный код
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]