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 |
|
Не зарегистрирован
|
А продуктивный диалог получился! |
|
Benish |
Отправлено: 12.01.2005, 14:47 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 67
|
Очень смешно! Лучше бы на вопрос кто ответил. А они смеются. |
|
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()
Зачем же так извращаться
За ссылку БОЛЬШОЕ СПАСИБО! Это то, что надо!
|
|
** 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 не возвращает значений!
Она просто удаляет элемент. Ай-ай-ай. |
|