|
|
|
Проблема обращения к com1 с разных мест программы
|
|||
|---|---|---|---|
|
#18+
Проблема обращения к com1 с разных мест программы Всем кто читает Большой ПРИВЕТ! =) работаю с последовательным портом и вот незадача =( возникла проблема обращения к com порту с разных мест проги а точнее (У меня есть два потока которые обращаются к этому порту и возникают моменты когда они вместе обращаются к нему и тут моя прога зависает.) Пробовал приостанавливать один из потоков пока один обращается к порту но это тоже приводит к зависанию. Знаю что можно как то сделать так чтобы при обращеннии к порту прога или её часть ждала когдапорт освободится но как это сделать ума не приложу. Подскажите как можно реализовать этот код. какой функцией пользоваться или пример какой если есть =) Примного благодарен всем кто отозвался =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2005, 10:37 |
|
||
|
Проблема обращения к com1 с разных мест программы
|
|||
|---|---|---|---|
|
#18+
Привет. Если в мультипоточном коде вы используете обращение к функциям, которые не являются потоково-безопасными, код следует немножко переделать. Вам быстрее окажут помошь если вы приведете фрагмент исходника потому как из вашего поста непонятно даже каким API вы пользуетесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2005, 10:50 |
|
||
|
Проблема обращения к com1 с разных мест программы
|
|||
|---|---|---|---|
|
#18+
Если ОС - Windows и если прога работает с портом одна, только в разных потоках, то решение - критические разделы. try EnterCriticalSection работаем с портом finally LeaveCriticalSection так в каждом потоке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2005, 11:06 |
|
||
|
Проблема обращения к com1 с разных мест программы
|
|||
|---|---|---|---|
|
#18+
Вот код которым я пользуюсь для доступа к порту: DWORD ComAccess::WriteData(LPCVOID pdata, DWORD len) { DWORD write; BOOL bSuccess; if ( len < 1 ) return(0); bSuccess = WriteFile(m_hCom,pdata, len, &write, &m_ov); if ( ! bSuccess ) { ComAccess::ErrorToString("WriteData(): WriteFile() failed"); return(-1); } return write; } DWORD ComAccess::ReadData(LPVOID pdest, DWORD len) { BOOL bSuccess; DWORD read = 0, mask = 0; if ( len < 1 ) return(0); bSuccess = ReadFile(m_hCom, pdest, len, &read,&m_ov); return read; } BOOL ComAccess::Open(LPCSTR lpszPortNum) { DCB dcb; BOOL bSuccess; m_hCom = CreateFile(lpszPortNum, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, NULL, 0); if ( m_hCom == INVALID_HANDLE_VALUE ) { // handle the error ComAccess::ErrorToString("CreateFile() failed, invalid handle value"); return FALSE; } bSuccess = GetCommState(m_hCom, &dcb); if ( ! bSuccess ) { ComAccess::ErrorToString("GetCommState() failed"); ComAccess::Close(); return FALSE; } dcb.fDtrControl=DTR_CONTROL_DISABLE; dcb.fBinary = TRUE; dcb.BaudRate = 38400; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; dcb.fOutX=FALSE; dcb.fOutxCtsFlow=FALSE; dcb.fOutxDsrFlow=FALSE; dcb.fInX=FALSE; dcb.fParity=0; bSuccess = SetCommState(m_hCom, &dcb); if ( ! bSuccess ) { ComAccess::ErrorToString("SetCommState() failed"); ComAccess::Close(); return FALSE; } return TRUE; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2005, 11:09 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33175143&tid=2032994]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
59ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
| others: | 224ms |
| total: | 373ms |

| 0 / 0 |
