Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: bomzzz
Дата сообщения: 19.02.2013 16:48
ну всем как бы присутсвующим
Автор: akaGM
Дата сообщения: 19.02.2013 17:05
конкретный вопрос :)
Автор: bomzzz
Дата сообщения: 19.02.2013 19:16
ну у вас же какие то соображения есть.
вот мне положим AVX на фиг не нужно - процессор не поддерживает, а в изучениях я на втором sse застрял, с другой стороны не пропомню ни единого случая чтоб мне .186 .286 директивы в серьез понадобились. так что 10 версией все таки логичнее пользоваться, масма в смысле
Автор: netfil
Дата сообщения: 20.02.2013 18:31
Здравствуйте, помогите разобраться;

Задание: Реализовать схему "оповещения" трех ожидающих потоков о помещении в очередь (произвольного формата) некоторого сообщения на основе объекта синхронизации "событие". Генерируют события в очередь два потока, которые имеют приоритет на уровень ниже, чем ожидающие. Посчитать среднее число обработанных каждым потоком сообщений. Очередь должна быть защищена критической секцией.

[more=Код моей программы]
Код: #include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

HANDLE hTimer;
HANDLE hIEvent[2];
HANDLE hOEvent[3];
HANDLE hThread[5];
LPDWORD lpThreadId[5];
int count, s[3];
int arr[10];
RTL_CRITICAL_SECTION cs;
DWORD hTimerWait;
const LARGE_INTEGER *li;

void LastErrorMessage(int LastErrorCode){
cout << "Error Code: " << LastErrorCode << endl;
return;
}

DWORD InputThread1(){
hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){

WaitForMultipleObjects(3, hOEvent, FALSE, INFINITE);
EnterCriticalSection(&cs);
if(count<11){
count++;
arr[count]=1;

cout << "InputThread 1: " << arr[count] << endl;
}
LeaveCriticalSection(&cs);
SetEvent(hIEvent[0]);
}
return true;
}
DWORD InputThread2(){
hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){

WaitForMultipleObjects(3, hOEvent, FALSE, INFINITE);
EnterCriticalSection(&cs);
if(count<11){
count++;
arr[count]=2;

cout << "InputThread 2: " << arr[count] << endl;
}
LeaveCriticalSection(&cs);
SetEvent(hIEvent[1]);
}
return true;
}
DWORD OutputThread1(){
hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){

WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
EnterCriticalSection(&cs);
if(count>0){
cout << "OutputThread 1: " << arr[count] << endl;
arr[count]=0;
count--;
s[0]++;
}
LeaveCriticalSection(&cs);
SetEvent(hOEvent[0]);
}
return true;
}
DWORD OutputThread2(){
hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){

WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
EnterCriticalSection(&cs);
if(count>0){
cout << "OutputThread 2: " << arr[count] << endl;
arr[count]=0;
count--;
s[1]++;
}
LeaveCriticalSection(&cs);
SetEvent(hOEvent[1]);
}
return true;
}
DWORD OutputThread3(){
hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){

WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
EnterCriticalSection(&cs);
if(count>0){
cout << "OutputThread 3: " << arr[count] << endl;
arr[count]=0;
count--;
s[2]++;
}
LeaveCriticalSection(&cs);
SetEvent(hOEvent[2]);
}
return true;
}


int main(){
setlocale(LC_ALL, "Russian");

const int n = 3, //число прогонов
Time = 1, //время работы каждого прогона
nTimerUnitsPerSecond = 10000000;

int i, y;

count=0;

InitializeCriticalSection(&cs);
hTimer=CreateWaitableTimer(NULL, TRUE, NULL);
li = li-(Time * nTimerUnitsPerSecond);

hIEvent[0]=CreateEvent(NULL,TRUE,FALSE, NULL);
hIEvent[1]=CreateEvent(NULL,TRUE,FALSE, NULL);
hOEvent[0]=CreateEvent(NULL,TRUE,TRUE, NULL);
hOEvent[1]=CreateEvent(NULL,TRUE,TRUE, NULL);
hOEvent[2]=CreateEvent(NULL,TRUE,TRUE, NULL);

for(i=0; i<3; i++) s=0;

for(y=0; y<n; y++){
cout << "прогон №: " << y << endl;

ResetEvent(hIEvent[0]);
ResetEvent(hIEvent[1]);
SetEvent(hOEvent[0]);
SetEvent(hOEvent[1]);
SetEvent(hOEvent[2]);

SetWaitableTimer(hTimer, li, 0, NULL, NULL, FALSE);

hThread[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)InputThread1,NULL,CREATE_SUSPENDED,lpThreadId[0]);
if (hThread[0] == 0) LastErrorMessage( GetLastError() );
SetThreadPriority(hThread[0],THREAD_PRIORITY_BELOW_NORMAL);

hThread[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)InputThread2,NULL,CREATE_SUSPENDED,lpThreadId[1]);
if (hThread[1] == 0) LastErrorMessage( GetLastError() );
SetThreadPriority(hThread[1],THREAD_PRIORITY_BELOW_NORMAL);

ResumeThread(hThread[0]);
ResumeThread(hThread[1]);

hThread[2]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread1,NULL,0,lpThreadId[2]);
if (hThread[2] == 0) LastErrorMessage( GetLastError() );

hThread[3]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread2,NULL,0,lpThreadId[3]);
if (hThread[3] == 0) LastErrorMessage( GetLastError() );

hThread[4]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread3,NULL,0,lpThreadId[4]);
if (hThread[4] == 0) LastErrorMessage( GetLastError() );

WaitForMultipleObjects(5,hThread,TRUE,INFINITE);

for(i=0; i<5; i++) CloseHandle(hThread[i]);
}

CloseHandle(hTimer);

for (i=0 ; i<2; i++)CloseHandle(hIEvent[i]);
for (i=0 ; i<3 ;i++) CloseHandle(hOEvent[i]);

DeleteCriticalSection(&cs);

cout << "Число обработанных сообщений: " <<endl;

cout << "OutputThread first " << s[0] << endl;
cout << "OutputThread second " << s[1] << endl;
cout << "OutputThread third " << s[2] << endl;

cout << "Кол-во исследований: " << n << endl;
cout << "Время исследования примерно: " << Time << " сек" << endl;

cout << "Cреднее число обработанных сообщений:" << endl;
cout << "OutputThread 1 " << s[0]/n << endl;
cout << "OutputThread 2 " << s[1]/n << endl;
cout << "OutputThread 3 " << s[2]/n << endl;

cin.get();
return 0;
}
Автор: Abs62
Дата сообщения: 20.02.2013 18:50
netfil

Цитата:
const LARGE_INTEGER *li;

И на что указывает этот указатель?
Автор: netfil
Дата сообщения: 20.02.2013 19:51
Abs62
Заменил эту строку на

Код: int li;
Автор: ne_viens
Дата сообщения: 20.02.2013 20:04
...
LARGE_INTEGER li;
...
li.QuadPart = -Time * nTimerUnitsPerSecond;
...
SetWaitableTimer(hTimer, &li, 0, NULL, NULL, FALSE);
...
Автор: netfil
Дата сообщения: 20.02.2013 20:19
ne_viens
спасибо, но зацикливание осталось, видимо, проблема в чем то еще...
Автор: ne_viens
Дата сообщения: 20.02.2013 20:46
...
while(hTimerWait==WAIT_TIMEOUT){
...

Таким образом ты контролируешь время работы потоков установленное с SetWaitableTimer() ?!
Автор: netfil
Дата сообщения: 20.02.2013 21:10
ne_viens
да
Автор: ne_viens
Дата сообщения: 20.02.2013 21:30
Каким образом hTimerWait получит значение !WAIT_TIMEOUT, чтобы потоки вышли из while и завершили работу?
Автор: netfil
Дата сообщения: 20.02.2013 21:49
ne_viens
при достижении SetEvent(), по идее, hTimerWait должен становиться WAIT_OBJECT_0
Автор: ne_viens
Дата сообщения: 20.02.2013 22:17
Не станет. Переменная получила своё значение от WaitForSingleObject()'ов и болше нет не одной строки кода, которая бы это изменила.

Чем не угодил:

while(flag)
{
doThreadStuff;
}

main()
flag = 1;
startThreads();
Sleep(1000);
flag = 0;
WaitForMultipleObjects();

?
Автор: netfil
Дата сообщения: 21.02.2013 00:13
ne_viens
все оказалось проще, если во всех потоках

Код: hTimerWait = WaitForSingleObject(hTimer, 100);
while(hTimerWait==WAIT_TIMEOUT){
Автор: AZJIO
Дата сообщения: 21.02.2013 04:10
Полный справочник по C - ссылка на CHM версию. Сделал дерево (Содержание), Указатель, шрифт Verdana, с меньшим размером. Возможно чуть похже добавлю вкладку Поиск, используя компилятор от "HTML Help Workshop".
Автор: VitaliM
Дата сообщения: 21.02.2013 04:24
AZJIO
Спасибо, но ....
У меня оглавление кракозябрами. Локаль русская, Винда7 х64.
Оглавление слева кракозябрами, вообще вся панель с оглавлением, указателями и избранным.
В основном окне все нормально.
Автор: AZJIO
Дата сообщения: 21.02.2013 05:38
VitaliM
Я по началу сгенерировал TOC с помощью htm2chm, но там были тексты типа "& egrave ;", они имели регистр букв случайный, поэтому я переделал в обычный текст. Сейчас ещё попробую. Навсякий случай посмотри это, если дерево проблем с кодировкой не имеет, то подгоню всё к этому формату.
Странно ещё и ошибки в текстах имеются "Интерпритатор"
Автор: VitaliM
Дата сообщения: 21.02.2013 05:54
AZJIO
В файле CustomUDFs.chm в левой панели с русским языком все нормально - по русски.
Автор: AZJIO
Дата сообщения: 21.02.2013 06:05
VitaliM
Ок, по той же ссылке перезалил, скомпилировав с помощью "HTML Help Workshop". Теперь вкладка "Поиск" есть.
Автор: VitaliM
Дата сообщения: 21.02.2013 06:12
AZJIO
Теперь все отлично! Спасибо.
Автор: AZJIO
Дата сообщения: 21.02.2013 06:51
Перезалил зеркало
1. добавил тему Black
2. Включил шрифт Consolas
Автор: ne_viens
Дата сообщения: 21.02.2013 10:55
>netfil

Цитата:
...

Код: while(WaitForSingleObject(hTimer, 100)==WAIT_TIMEOUT){

то все работает
Автор: AZJIO
Дата сообщения: 21.02.2013 11:32
Существует ли Tidy для Си,C++?
Автор: bomzzz
Дата сообщения: 21.02.2013 14:15
помогите пожалуйста на Си переделать, и напишите как скомпилировать правильно батником
ntdll.asm

Цитата:

    .386
    .model flat, stdcall
    option casemap :none

.code

LibMain proc instance:DWORD, reason:DWORD, reserved:DWORD

    mov eax, 1
    ret

LibMain endp

RtlUshortByteSwap PROC FASTCALL PARAM1:DWORD

    ret
RtlUshortByteSwap endp

end LibMain

ntdll.def

Цитата:
LIBRARY ntdll.dll
EXPORTS @RtlUshortByteSwap@4

http://rghost.ru/43963366


пытаюсь сделать либу из инклуда для масма. а масм FASTCALL вызов не поддерживает, вот такая микрософта гадюка (в принципе мы не гордые, можем сами положить все куда надо и стек выровнять, но либу фиг сделаешь). делаю POASM-ом который FASTCALL понимает, но вот ни фига не получается. с родной библиотекой из DDK все работает, а с самодельными либами FASTCALL функции работать не хотят (decl stdcall работают). винда от дров сделанных с таким либами вообще валится, какая то ошибка ядра
Автор: ne_viens
Дата сообщения: 21.02.2013 14:45
////////////////ntdll.c///////////////
//cl /Ox /LD ntdll.c ntdll.def

unsigned short __fastcall RtlUshortByteSwap(unsigned short x)
{
return _byteswap_ushort(x);
}

////////////////ntdll.def///////////////
LIBRARY ntdll
EXPORTS RtlUshortByteSwap


////////////////test.c///////////////
//cl /Ox test.c
#pragma comment(lib, "myntdll.lib")

unsigned short __fastcall RtlUshortByteSwap(unsigned short);

int main()
{
return RtlUshortByteSwap(0x2211);
}



Только нафик это надо, если можно просто inline написать: _byteswap_ushort(x);
Там 3 инструкции ассемблера.

Автор: bomzzz
Дата сообщения: 21.02.2013 14:47

Цитата:
Только нафик это надо, если можно просто inline написать: _byteswap_ushort(x);
Там 3 инструкции ассемблера.

не понял

Добавлено:
а где в коде вот эта часть? или она где то автоматом в инклудах? у меня то не студия а кусок от сутудии. сейчас попробую

Цитата:
LibMain proc instance:DWORD, reason:DWORD, reserved:DWORD

mov eax, 1
ret
Автор: ne_viens
Дата сообщения: 21.02.2013 15:06
Зачем вызывать RtlUshortByteSwap(), если полные ее аналоги на МАSMe:
mov al, ch
mov ah, cl

на C:
_byteswap_ushort(x);

При вызове из ntdll.dll добавляется

E8 04000000 CALL <JMP.&ntdll.RtlUshortByteSwap>
FF25 E8804000 JMP DWORD PTR DS:[<&ntdll.RtlUshortByteSwap>]

в начале и RET в конце.
Итого имеем кода на 300% больше.


LibMain() автоматом собирается из DEFAULTLIB.

Автор: bomzzz
Дата сообщения: 21.02.2013 15:16
затем что это практически единственная функция из ядра которую можно безопасно вызвать для проверки. а если на драйвере проверять от которого винда валится это бибилиотека обойтеся в винт, а может еще время на восстановление винды потребоваться
Автор: ne_viens
Дата сообщения: 21.02.2013 15:19
Проверки чего?
Автор: bomzzz
Дата сообщения: 21.02.2013 15:21
ne_viens



Цитата:
.\bin\cl.exe /Ox /LD ntdll.c ntdll.def /link /libpath:.\lib /noentry


Добавлено:
ne_viens

_byteswap_ushort
я чета не понял, она что ли сама байты переворачивает, а не обращается к NTDLL.DLL ???
мне нужна динамическая библиотека которая только скелет дллки ntdll.dll повторяет, чтоб при компиляции она использовалась как таблица импорта(?). а байты можно и без подпрограммы перевернуть
http://rghost.ru/43966173 у меня есть инклуд сделанный из мсдновской библиотеки взятой из DDK. он будет лежать в инсталяторе масма. а когда масм будет инсталироваться то все либы сделаются из этих инклудов. тогда дистриутив будет весить всего ничего, в либах будет только все нужное, и некоторые исправления и исключения они учтут



Цитата:

unsigned long __fastcall RtlUshortByteSwap(unsigned long x)
{
return;
}

судя по тому что и так переворачивает - вот так и есть то что надо

а как будет изменятьс код если параметров будет больше? код будет создаваться батником из инклудов

Цитата:
EXTERNDEF SYSCALL @RtlUshortByteSwap@4:PROC
RtlUshortByteSwap textequ <@RtlUshortByteSwap@4>
EXTERNDEF SYSCALL @RtlUlonglongByteSwap@8:PROC
RtlUlonglongByteSwap textequ <@RtlUlonglongByteSwap@8>
EXTERNDEF SYSCALL @RtlUlongByteSwap@4:PROC
RtlUlongByteSwap textequ <@RtlUlongByteSwap@4>
EXTERNDEF SYSCALL @RtlInterlockedPushListSList@16:PROC
RtlInterlockedPushListSList textequ <@RtlInterlockedPushListSList@16>



Добавлено:
вот так это выглядит. запусти батник makelibs. для 2000-ка они быстро делаются
http://rghost.ru/43967060

Добавлено:

Цитата:
DbgPrintEx PROTO C :VARARG
DbgPrint PROTO C :VARARG
DbgBreakPoint PROTO STDCALL
CsrSetPriorityClass PROTO STDCALL :DWORD,:DWORD
CsrProbeForWrite PROTO STDCALL :DWORD,:DWORD,:DWORD


Цитата:
////////////////ntdll.c///////////////
//cl /Ox /LD ntdll.c ntdll.def

unsigned long __fastcall RtlUshortByteSwap(unsigned long x)
{
return 0;
}
unsigned long __fastcall RtlUlongByteSwap(unsigned long x)
{
return 0;
}
unsigned long __fastcall RtlUlonglongByteSwap(unsigned long x,unsigned long y)
{
return 0;
}
unsigned long __fastcall RtlInterlockedPushListSList(unsigned long w,unsigned long x,unsigned long y,unsigned long z)
{
return 0;
}


а как stdcall и decl будут добавляться? а с возвращаемым числом я не намудрил?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.