C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Пара вопросов, array vs. vector, данные в разл. потоках
Benish
Отправлено: 12.01.2005, 12:47


Дежурный стрелочник

Группа: Участник
Сообщений: 67



Господа, есть пара вопросов.

1. Array vs. vector.

Есть программа которая читает в массив из порта.

CODE

   byte Buffer[64];
   int Numbyte = 64              // макс. возм. количество приним. байт
   .....
   n = Read(Buffer,Numbyte);



Можно ли этот массив заменить на vector?

т.е. сделать так:

CODE

   vector<byte> Buffer(64);
   int Numbyte = 64             // макс. возм. количество приним. байт    
   ......
   n = read(Buffer.begin(),Numbyte);
   Buffer.resize(n);

Benish
Отправлено: 12.01.2005, 13:43


Дежурный стрелочник

Группа: Участник
Сообщений: 67



Получается что можно.
По крайней мере мой эксперимент удался:

CODE

   byte b[6] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
   int l1 = (b+6)-b;
   vector<byte> V3(b,b+6);
   int l2 = V3.end()-V3.begin();
   V3.resize(64);
   byte *bptr;
   bptr = V3.begin();
   int i;
   for (i=0; i<6; i++) bptr[i] = i+1;
   V3.resize(i+1);
   copy (V3.begin(),V3.end(),b);



В массиве b оказываются числа 1,2,3,4,5,6.
Benish
Отправлено: 12.01.2005, 13:53


Дежурный стрелочник

Группа: Участник
Сообщений: 67



Теперь вопрос №2:

Основной поток должен передавать команды в очередь которая расположена в другом
потоке. В этом другом потоке эта самая очередь должна обрабатываться.
Как организовать совместную работу? Воспользоваться Synchronize()?
Вопрос такой: Если я в основном потоке буду передовать команды в очередь напрямую,
а в другом потоке работать с очередью через Synchronize(), это будет корректно?
И где лучше располагать очередь? В основном потоке или в дополнительном?
Benish
Отправлено: 12.01.2005, 14:10


Дежурный стрелочник

Группа: Участник
Сообщений: 67



В предыдущем примере вместо:

CODE

// bptr = V3.begin();
// нужно использовать
bptr = &V3[0];



т.к. V3.begin() возвращает итератор, а не указатель.
Guest
Отправлено: 12.01.2005, 14:30


Не зарегистрирован







А продуктивный диалог получился! biggrin.gif
Benish
Отправлено: 12.01.2005, 14:47


Дежурный стрелочник

Группа: Участник
Сообщений: 67



Очень смешно! Лучше бы на вопрос кто ответил. А они смеются. wink.gif
Asher
Отправлено: 12.01.2005, 15:00


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
можно и разъименование итератора сделать...
*V3.begin()

Сам вектор непотокобезопасен, поэтому надо применять дополнительные меры по синхронизации.
С синхронизе в потоке можно работать без проблем, но это не совсем параллельно.
По поводу потокобезопасности можете заглятуть сюда Оцените templat'ы, я там ссылку на другой форум давал.
Asher
Отправлено: 12.01.2005, 15:06


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
можно и разъименование итератора сделать...
*V3.begin()

Сам вектор непотокобезопасен, поэтому надо применять дополнительные меры по синхронизации.
С синхронизе в потоке можно работать без проблем, но это не совсем параллельно.
По поводу потокобезопасности можете заглятуть сюда Оцените templat'ы, я там ссылку на другой форум давал.
** benish
Отправлено: 12.01.2005, 16:37


Не зарегистрирован







QUOTE (Asher @ 12/01/2005, 16:08)

можно и разъименование итератора сделать...
*V3.begin()


Но тогда придется писать: &*V3.begin()
Зачем же так извращаться wink.gif

За ссылку БОЛЬШОЕ СПАСИБО! Это то, что надо!
** Benish
Отправлено: 14.01.2005, 17:06


Не зарегистрирован







А можно еще вопрос?

Вот, взял потокобезопасный класс с форума и ничего не работает.

Сделал файл ThreadSafe.h:

CODE


//---------------------------------------------------------------------------
class TMTMethod
{
private:
 CRITICAL_SECTION *pCS;
public:
 TMTMethod(CRITICAL_SECTION &CS):pCS(&CS){EnterCriticalSection(pCS);}
 ~TMTMethod(){LeaveCriticalSection(pCS);}
};
//---------------------------------------------------------------------------
template<class T> class mtdeque: public deque<T>
{
public:
 CRITICAL_SECTION CS;
 mtdeque(){InitializeCriticalSection(&CS);}
 ~mtdeque(){DeleteCriticalSection(&CS);}
};
#define MT(x,method) {TMTMethod MTMethod(x.CS); x.method;}
//---------------------------------------------------------------------------


в потоке сделал #include, очередь описал:

CODE

mtdeque<int>    Send_Commands;



использую ее:
CODE

   MT(Send_Commands,push_back(Command);
...........
   MT(Send_Commands,pop_front(Command);




а компилятор мне пишет:
CODE

 [C++ Error] Uthwrite.cpp(235): E2219 Wrong number of arguments in call of macro 'MT'
 [C++ Error] Uthwrite.cpp(235): E2511 Unterminated macro argument started on line 85
 [C++ Error] Uthwrite.cpp(235): E2134 Compound statement missing }


Самое интересное, что 235 строки в моей программе нет...

Смотрел, смотрел, на мол дилетантский взгляд — все правильно....
Подскажите, плиз, где ошибка!
Asher
Отправлено: 14.01.2005, 17:15


Мастер участка

Группа: Модератор
Сообщений: 550



Скобку закрывающую потерял
Benish
Отправлено: 14.01.2005, 17:18


Дежурный стрелочник

Группа: Участник
Сообщений: 67



Спасибо!

Уже нашел.

И еще обнаружил, что pop_front не возвращает значений!
Она просто удаляет элемент. Ай-ай-ай.

Вернуться в Вопросы программирования в C++Builder