Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2010, 16:58   #1
_Денис
Пользователь
 
Аватар для _Денис
 
Регистрация: 12.11.2009
Сообщений: 20
По умолчанию Синхронизация потоков с использованием именованых каналов

Есть приложение-сервер и приложение-клиент

Сервер создаёт 3 реализации именованого канала и ждёт пока к нему подключатся клиенты. После подключения клиенты могут давать серверу команды date, time, help, exit. Выдать дату, выдать время, справка и выход соответствуююще. Проблема в том, что после запуска 3 приложений клиентов работает только одно, самое первое запущенное.
А необходимо сделать так, что бы срвер принимал команды от всех трёх клиентов одновременно.
Их надо синхронизировать с помощью критических секций.
Собсна вопросы:

1. Почему работает только самый первый клиент?
2. Что необходимо сделать, что бы 3 клиента работали парралельно?
3. В каком месте поставить вход в критическую секцию?

Код приложения сервер:
Код:
.686
.model flat, stdcall
option casemap :none
include ..\interface.inc
include PipeServer.inc

.code
start:
	invoke Main
	invoke ExitProcess,0
Main proc
invoke AllocConsole
invoke CharToOem,\
		$CTA0("Предоставляет именованый канал для связи с другим процессом и выполняет полученные от него команды"),\
		ADDR OutputBuffer
invoke SetConsoleTitle,ADDR OutputBuffer
invoke ClearScreen

mov ebx, 3
.while ebx != 0
	invoke CreateNamedPipe, ADDR szPipeName,\
		PIPE_ACCESS_DUPLEX OR FILE_FLAG_OVERLAPPED,\
		PIPE_TYPE_MESSAGE OR PIPE_WAIT,\
		3,\
		LENGTHOF InputBuffer,	LENGTHOF OutputBuffer,\
		NULL, NULL
	dec ebx
.endw

.if eax==INVALID_HANDLE_VALUE
	invoke StdOut, $CTA0("Cannot create pipe")
	invoke StdIn,ADDR InputBuffer, LENGTHOF InputBuffer
    	ret
.elseif 
	mov hPipe,eax
.endif
invoke StdOut, $CTA0("Connection . . .")
invoke ConnectNamedPipe,hPipe,NULL
invoke locate,11,0
invoke StdOut, $CTA0("successful")
invoke locate,0,2
lea esi,InputBuffer
lea edi,OutputBuffer
.while (TRUE)


	invoke ReadFile,hPipe,esi,LENGTHOF InputBuffer,\
  		ADDR nSendReciveBytes, NULL
  	or dword ptr [esi],20202020h			;XxXx -> xxxx
	invoke StdOut,esi
	.break .if dword ptr [esi]==74697865h	;exit -> tixe
	mov ebx,edi 
	.if dword ptr [esi]==65746164h 
				
  		Сдесь код получения системной даты
                      и переод её в строку

    		invoke WriteFile,hPipe,edi, LENGTHOF OutputBuffer,\
			ADDR nSendReciveBytes, NULL
	
	.elseif dword ptr [esi]==656D6974h
	
		Сдесь код получения системного времени
                      и перевод её в строку

		invoke WriteFile,hPipe,edi, LENGTHOF OutputBuffer,\
			ADDR nSendReciveBytes, NULL
	
	.elseif dword ptr [esi]==706C6568H
	
		invoke WriteFile,hPipe, $CTA0("Command list:\nhelp - view help\ntime - view current time\ndate - view current date\nexit - exit the program\n"), 128,\
			ADDR nSendReciveBytes, NULL

	.else
		invoke WriteFile,hPipe, $CTA0("Bad command\n"), 13,\
			ADDR nSendReciveBytes, NULL 
.endif

invoke RtlFillMemory, addr OutputBuffer, 512, 00h
invoke RtlFillMemory, addr InputBuffer, 512, 00h
.endw
invoke WriteFile,hPipe,$CTA0("exit\n"), 6,\
	ADDR nSendReciveBytes, NULL
invoke CloseHandle, hPipe
ret
Main endp
end start
Код приложения - клиента:
Код:
.386
.model flat, stdcall
option casemap :none
include ..\interface.inc
include PipeClient.inc

.code
start:
	invoke Main
	invoke ExitProcess,0
Main proc
invoke AllocConsole
invoke CharToOem,\
		$CTA0("Взаимодействует с приложением предоставившим именованый канал"),\
		ADDR OutputBuffer
invoke SetConsoleTitle,ADDR OutputBuffer 
invoke ClearScreen
invoke StdOut, $CTA0("Connection . . . ")
invoke CreateFile, ADDR szPipeName,\
		GENERIC_READ OR GENERIC_WRITE,\
		0, NULL, OPEN_EXISTING, 0, NULL
.if eax==INVALID_HANDLE_VALUE
	invoke locate,0,0
	invoke StdOut, $CTA0("Cannot open pipe. Press Enter to exit...")
	invoke StdIn,ADDR InputBuffer, LENGTHOF InputBuffer 
	ret
.else 
	mov hPipe,eax
.endif
invoke locate,11,0
invoke StdOut, $CTA0("successful")
invoke locate,0,2
lea esi,InputBuffer
lea edi,OutputBuffer
.while (TRUE)
	mov ebx,edi
	invoke StdOut,$CTA0("\nCommand$ ")
	invoke StdIn,edi,LENGTHOF OutputBuffer
	mov al,0Dh
	mov ecx,LENGTHOF OutputBuffer
	push edi
	repne scasb
	mov byte ptr [edi+1],0h
	sub edi,ebx
	lea ebx,[edi+2]
	pop edi
	invoke WriteFile,hPipe, edi, ebx,\
	 	ADDR nSendReciveBytes,NULL
	invoke ReadFile,hPipe,esi,\
		LENGTHOF InputBuffer,ADDR nSendReciveBytes, NULL
	invoke StdOut, esi
.break  .if dword ptr [esi]==74697865h
invoke RtlFillMemory, addr OutputBuffer, 512, 00h
invoke RtlFillMemory, addr InputBuffer, 512, 00h
.endw
invoke CloseHandle, hPipe
ret
Main endp
end start
Я бы изменил мир, но исходников нету
_Денис вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi и VLC Player - программное переключение каналов ViNcHeStEr Мультимедиа в Delphi 17 17.01.2010 13:12
Синхронизация kostyan142 Общие вопросы по Java, Java SE, Kotlin 6 13.01.2010 01:39
Включение\отключение каналов SanekIrk Мультимедиа в Delphi 1 19.10.2009 17:10
Синхронизация yarilo Софт 2 07.08.2009 15:50