Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / To Flex2 (fll+thread) / 19 сообщений из 19, страница 1 из 1
25.08.2003, 14:29
    #32246275
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
В общем случае задача вызова из функции FLL асинхронной функции (потоковая функция, в нашем случае thread) не решается. Например,

Код: 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.
#include  "pro_ext.h" 

DWORD WINAPI thread(void *parm)
{
	_PutStr( "test" ); // вот здесь мы получаем аппаратную ошибку защиты

	return  0 ;
}

void hello(ParamBlk  *parm)
{
	HANDLE h = CreateThread( 0 ,  0 , thread, parm,  0 ,  0 );
	
	if( h == NULL)
		return;

	if( WaitForSingleObject(h, INFINITE) == WAIT_OBJECT_0 )
	{
		//...
	}

	CloseHandle(h);
}

FoxInfo myFoxInfo[] = {
	{ "HELLO" ,(FPFI) hello,  1 ,  "C" },
};


#ifdef __cplusplus
extern  "C"  {
#endif

FoxTable _FoxTable = {
	(FoxTable  *)  0 , sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
};

#ifdef __cplusplus
}
#endif


Проблема заключается в TLS (thread local storage), которые (их три при обмене с фоксом) при порождении потока (thread) вовсе не инициализированы (то есть некому настраивать TlsSetValue). А все функции winapims.lib (_PutXXX, _SetXXX) явно или косвенно работают с TLS (TlsGetValue) и получают 0, что и приводит к ошибке общей защиты.

Что можно сделать? Попробовать разобраться в том что делает DispatchAPI (это та функция которая и запускает наши FLL функции) из winapims.lib и симитировать его работу по настройке контекста вызова в самом thread-e.

Меня на имитацию не хватило:(
...
Рейтинг: 0 / 0
25.08.2003, 15:42
    #32246423
Flex2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
Спасибо Анатолий!
У меня такой код отрабатывает.
Мало того, из потока я добился выполнения методов посредсвом _Execute()
и присвоение значение в глобальнве переменные используя _FindVar и _Store. Не работает только исключительно _SetObjectProperty() причем ev_type cтрукутры объекта явно указывает что это объект.
Спасибо за совет, попробую поиграть с TLS.
...
Рейтинг: 0 / 0
25.08.2003, 15:51
    #32246444
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
А на какой операционной системе вы тестируете?

В w2k sp3 вылетает.
...
Рейтинг: 0 / 0
25.08.2003, 15:58
    #32246459
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
А не проще написать СОМ- объект и в нем запускать нужный поток?...
...
Рейтинг: 0 / 0
25.08.2003, 15:59
    #32246461
Flex2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
98 - отрабатывает
NT 4.0 - отрабатывает.
...
Рейтинг: 0 / 0
25.08.2003, 16:04
    #32246473
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
2 Flex2

Ни 98, ни NT4.0 не поддерживает потоки. Как вам повезло-то, а!:)
...
Рейтинг: 0 / 0
25.08.2003, 16:08
    #32246484
Flex2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
У вас, по моему, некорректное завершение потока "return 0;" тут не отделаешься, нужно "_endthreadex( 0 );" А еще лучше получить код завершения "GetExitCodeThread()".
И подпирая код WaitForSingleObject функцией ожидания объекта ядра - собития бесконечно INFINITE вы грозитесь повесить систему вызовом этой функции из приложения Visual Foxpro.
...
Рейтинг: 0 / 0
25.08.2003, 16:09
    #32246489
Flex2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
Не поддерживаются фиберы :)
Потоки поддерживаются. Хотя в NT поддерживаются и они.
...
Рейтинг: 0 / 0
25.08.2003, 16:11
    #32246494
Flex2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
ТО Crip
Ссылочку не дадите, где можно посмотреть как это делать ?
Или в кратце просвятите как считаете нужным ?
...
Рейтинг: 0 / 0
25.08.2003, 16:18
    #32246505
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
Да, наверное, я поспешил с заявлением о поддержке. Но

>У вас, по моему, некорректное завершение потока "return 0;" тут не отделаешься, нужно "_endthreadex( 0 );"
не, это не обязательно

>А еще лучше получить код завершения "GetExitCodeThread()".
мой return 0 как раз и является тем GetExitCodeThread()

>И подпирая код WaitForSingleObject функцией ожидания объекта ядра - собития бесконечно INFINITE вы грозитесь повесить систему вызовом этой функции из приложения Visual Foxpro.

Это нужно мне было для отладки. А повесить систему - это врядли - это только, если thread никогда не завершится.
...
Рейтинг: 0 / 0
25.08.2003, 16:24
    #32246522
Flex2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
Согласен. Только это не решает проблему.
А проблема-то интересная.
...
Рейтинг: 0 / 0
25.08.2003, 16:28
    #32246532
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
2Flex2
Как писать COМ объекты на С++?
Неплохо здесь
http://www.firststeps.ru/mfc/activex/activex1.html
И здесь:
http://clubpro.spb.ru/cominside/

Потоки там создаются аналогичным образом.
С фоксом я работаю импортируя библиотеку типов _Vfp.Application .
...
Рейтинг: 0 / 0
25.08.2003, 16:33
    #32246542
anatoly_s
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
Я уже сказал, что нужно сделать для "решения" проблемы, а именно - разобраться с тем, что происходит в следующем коде. Основной недостаток этого "решения", что в привязке к конкретной версии фокса и операционной системы. А так, если есть желание, то "вперед, на шпалы":):

Код: 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.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
@DispatchAPI@ 4 :
100010EC   push        ebp
100010ED   mov         ebp,esp
100010EF   sub         esp,44h
100010F2   push        esi
100010F3   lea         eax,[ebp-44h]
100010F6   push        40h
100010F8   mov         esi,offset __FoxTable+128h ( 10014548 )
100010FD   push        esi
100010FE   mov         dword ptr [ebp- 4 ],ecx
 10001101    push        eax
 10001102    call        dword ptr [__imp__memmove (1001517c)]
 10001108    add         esp,0Ch
1000110B   push         0 
1000110D   push        esi
1000110E   call        _setjmp3 (1000181a)
 10001113    add         esp, 8 
 10001116    test        eax,eax
 10001118    jne         @DispatchAPI@ 4 +82h (1000116e)
1000111A   mov         esi,dword ptr [ebp- 4 ]
1000111D   mov         eax,dword ptr [esi+14h]
 10001120    cmp         eax,12h
 10001123    ja          @DispatchAPI@ 4 +82h (1000116e)
 10001125    jmp         dword ptr [eax* 4 +100011E8h]
1000112C   push        dword ptr [esi+18h]
1000112F   push        dword ptr [__FoxTable+10h ( 10014430 )]
 10001135    call        dword ptr [__imp__TlsSetValue@ 8  (1001511c)]
1000113B   mov         ecx,dword ptr [ebp- 4 ]
1000113E   mov         eax,[__FoxTable+14h ( 10014434 )]
 10001143    push        dword ptr [ecx]
 10001145    push        eax
 10001146    call        dword ptr [__imp__TlsSetValue@ 8  (1001511c)]
1000114C   mov         ecx,dword ptr [ebp- 4 ]
1000114F   mov         eax,[__FoxTable+18h ( 10014438 )]
 10001154    push        dword ptr [ecx+ 4 ]
 10001157    push        eax
 10001158    call        dword ptr [__imp__TlsSetValue@ 8  (1001511c)]
1000115E   mov         esi,dword ptr [ebp- 4 ]
 10001161    mov         dword ptr [esi+ 4 ],1388h
 10001168    mov         dword ptr [esi],offset __FoxTable ( 10014420 )
1000116E   push        40h
 10001170    lea         eax,[ebp-44h]
 10001173    push        eax
 10001174    push        offset __FoxTable+128h ( 10014548 )
 10001179    call        dword ptr [__imp__memmove (1001517c)]
1000117F   add         esp,0Ch
 10001182    xor         eax,eax
 10001184    pop         esi
 10001185    mov         esp,ebp
 10001187    pop         ebp
 10001188    ret
 10001189    lea         ecx,[esi+24h]
1000118C   call        dword ptr [esi+18h]
1000118F   jmp         @DispatchAPI@ 4 +82h (1000116e)
 10001191    mov         edx,dword ptr [esi+ 4 ]
 10001194    mov         ecx,dword ptr [esi]
 10001196    call        @xWinCall@ 8 +0C6h (100013f4)
1000119B   mov         dword ptr [esi],eax
1000119D   jmp         @DispatchAPI@ 4 +82h (1000116e)
1000119F   mov         ecx,dword ptr [esi]
100011A1   call        @_FreeHand@ 4  ( 10001473 )
100011A6   jmp         @DispatchAPI@ 4 +82h (1000116e)
100011A8   mov         ecx,dword ptr [esi]
100011AA   call        @_HandToPtr@ 4  (100014b5)
100011AF   mov         dword ptr [esi],eax
100011B1   jmp         @DispatchAPI@ 4 +82h (1000116e)
100011B3   mov         edx,dword ptr [esi+ 4 ]
100011B6   mov         ecx,dword ptr [esi]
100011B8   call        dword ptr [esi+18h]
100011BB   jmp         @DispatchAPI@ 4 +82h (1000116e)
100011BD   lea         edx,[esi+24h]
100011C0   mov         ecx,dword ptr [esi]
100011C2   call        dword ptr [esi+18h]
100011C5   mov         dword ptr [esi],eax
100011C7   jmp         @DispatchAPI@ 4 +82h (1000116e)
100011C9   mov         ecx,dword ptr [esi]
100011CB   call        @xWinCall@ 8 +1Bh ( 10001349 )
100011D0   mov         dword ptr [esi],eax
100011D2   jmp         @DispatchAPI@ 4 +82h (1000116e)
100011D4   mov         ecx,dword ptr [esi]
100011D6   call        @xWinCall@ 8 +68h ( 10001396 )
100011DB   jmp         @DispatchAPI@ 4 +82h (1000116e)
100011DD   mov         ecx,dword ptr [esi]
100011DF   call        @xWinCall@ 8 +9Fh (100013cd)
100011E4   mov         dword ptr [esi],eax
100011E6   jmp         @DispatchAPI@ 4 +82h (1000116e)
100011E8   sub         al,11h
100011EA   add         byte ptr [eax],dl
100011EC   mov         dword ptr [ecx],edx
100011EE   add         byte ptr [eax],dl
100011F0   xchg        eax,ecx
100011F1   adc         dword ptr [eax],eax
100011F3   adc         byte ptr [esi+11h],ch
100011F6   add         byte ptr [eax],dl
100011F8   lahf
100011F9   adc         dword ptr [eax],eax
100011FB   adc         byte ptr [esi+11h],ch
100011FE   add         byte ptr [eax],dl
 10001200    test        al,11h
 10001202    add         byte ptr [eax],dl
 10001204    outs        dx,byte ptr [esi]
 10001205    adc         dword ptr [eax],eax
 10001207    adc         byte ptr [esi+11h],ch
1000120A   add         byte ptr [eax],dl
1000120C   outs        dx,byte ptr [esi]
1000120D   adc         dword ptr [eax],eax
1000120F   adc         byte ptr [ebx-42EFFFEFh],dh
 10001215    adc         dword ptr [eax],eax
 10001217    adc         byte ptr [esi+11h],ch
1000121A   add         byte ptr [eax],dl
1000121C   outs        dx,byte ptr [esi]
1000121D   adc         dword ptr [eax],eax
1000121F   adc         byte ptr [ecx+11h],ah
 10001222    add         byte ptr [eax],dl
 10001224    outs        dx,byte ptr [esi]
 10001225    adc         dword ptr [eax],eax
 10001227    adc         cl,cl
 10001229    adc         dword ptr [eax],eax
1000122B   adc         ah,dl
1000122D   adc         dword ptr [eax],eax
1000122F   adc         ch,bl
 10001231    adc         dword ptr [eax],eax
 10001233    adc         byte ptr [ebp-75h],dl
 10001236    inc         esp
 10001237    and         al, 8 
 10001239    mov         ebp,esp
1000123B   sub         esp,1Ch
1000123E   mov         dword ptr [ebp-0Ch],ecx
 10001241    mov         dword ptr [ebp-1Ch],edx
 10001244    mov         ecx,dword ptr [ebp+0Ch]
 10001247    mov         edx,dword ptr [ebp+10h]
1000124A   mov         dword ptr [ebp-18h],eax
1000124D   mov         dword ptr [ebp-14h],ecx
 10001250    mov         eax,dword ptr [ebp+14h]
 10001253    lea         ecx,[ebp-1Ch]
 10001256    mov         dword ptr [ebp-10h],edx
 10001259    mov         dword ptr [ebp- 4 ],eax
1000125C   call        @xxxxxWinCall@ 24 +36h (1000126a)
 10001261    mov         eax,dword ptr [ebp-1Ch]
 10001264    mov         esp,ebp
 10001266    pop         ebp
 10001267    ret         10h
1000126A   push        esi
1000126B   mov         eax,[__FoxTable+10h ( 10014430 )]
 10001270    push        edi
 10001271    mov         esi,ecx
 10001273    push        eax
 10001274    xor         edi,edi
 10001276    call        dword ptr [__imp__TlsGetValue@ 4  ( 10015118 )]
1000127C   test        eax,eax
1000127E   je          @xxxxxWinCall@ 24 +60h ( 10001294 )
 10001280    mov         ecx,esi
 10001282    mov         dword ptr [esi+14h],edi
 10001285    call        eax
 10001287    mov         eax,dword ptr [esi+10h]
1000128A   cmp         eax,53h
1000128D   je          @xxxxxWinCall@ 24 +60h ( 10001294 )
1000128F   cmp         eax,54h
 10001292    jne         @xxxxxWinCall@ 24 +65h ( 10001299 )
 10001294    mov         edi, 1 
 10001299    test        edi,edi
1000129B   je          @xxxxxWinCall@ 24 +79h (100012ad)
1000129D   push         1 
1000129F   push        offset __FoxTable+128h ( 10014548 )
100012A4   call        dword ptr [__imp__longjmp ( 10015168 )]
100012AA   add         esp, 8 
100012AD   pop         edi
100012AE   pop         esi
100012AF   ret
...
Рейтинг: 0 / 0
25.08.2003, 16:37
    #32246556
Flex2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
То Crip
Спасибо

То anatoly_s
Спасибо, но я не силен в ASM, да и время поджимает.
...
Рейтинг: 0 / 0
25.08.2003, 18:08
    #32246734
Flex2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
Господа, где же выход ?
Разбираться с технологие СOM - задача перешедшая в разряд потребности для любого программиста, но сразу как говорится "только кошки родятся", код
с заданным функционалом в поставленное время написан не будет, если разбираться с этой технологией с "0".
Изучать ASM - времени нет по определению.
Я обречен на провал ? Или... ?
...
Рейтинг: 0 / 0
25.08.2003, 18:11
    #32246737
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
Почему? Ведь если задуматься, то насколько вам необходимо использовать асинхронный вызов - реальный пример, пожалуйста, приведите. Все вами приведенные примеры не требовали асинхронности или я не прав?
...
Рейтинг: 0 / 0
25.08.2003, 18:25
    #32246750
Flex2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
Дело в том, что программулина по замыслу:
1. работат с COM - портами
2 на каждом порту 4 линии(абстракных, этаких "конверторов аналоговых сигналов с байтовую последовательность) и все это сыплется в порт на котром они сидят.
3. Необходимо добится максимальной параллельности работы портов, обработка байтовых последовательностей - фоновая.
4. в Foxe каждый порт как объект, отсуда и возникла проблема независимости собитий (дергания из потока метода объекта порта, допустим
oPort(1).onRecive()
Все "cемейство" объектов oPort - созданы на основе 1 класса с одиноковой функциональностью.
5. задумка была ничего не дергать, а сделать свойсво_Assign для хранения входящих данных и присваивать ему используя _SetObjectProperty то, что лезет в соответствующий буфер соответсвующего порта для соответсвующего ассоциированногго с портом объектом.
Все работает - а вот с передачей параметров в объект , типа "ON-LINE", справиться наименьшей кровью не могу.
...
Рейтинг: 0 / 0
27.08.2003, 15:18
    #32249005
Flex2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
Версий, как я понимаю, больше нет.
Жаль.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
17.09.2004, 17:26
    #32700344
xamlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
To Flex2 (fll+thread)
После всего этого прочитанного -
Мне пора к врачу...
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / To Flex2 (fll+thread) / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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