Вот пример кода, который работает с использованием вызова select
.
Он , только работает для новой строки, потому что уровень TTY в ядре будет удерживаться до тех пор, пока он не получит новую строку.
Итак, для любого другого символа (например, пробела) нам нужно было бы выполнить вызовы ioctl
, о которых я упоминал в моих главных комментариях, чтобы перевести слой в «сырой» режим (по сравнению со значением по умолчанию «cooked»). , Если вам это нужно, см. tcgetattr
и tcsetattr
звонки.
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <sys/time.h>
#include <sys/select.h>
int
main(void)
{
int fd;
char buf[10];
int len;
fd_set rdset;
fd = 0;
while (1) {
// this is do whatever until newline is pressed ...
printf(".");
fflush(stdout);
// set up the select mask -- the list of file descriptors we want to
// wait on for read/input data available
FD_ZERO(&rdset);
FD_SET(fd,&rdset);
// set timeout of 1ms
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 1000;
// wait for action on stdin [or loop if timeout]
// the first arg must be: the highest fd number in the mask + 1
len = select(fd + 1,&rdset,NULL,NULL,&tv);
if (len <= 0)
continue;
// we're guaranteed at least one char of input here
len = read(fd,buf,1);
if (len <= 0)
continue;
// wait for newline -- stop program when we get it
if (buf[0] == '\n')
break;
}
printf("\n");
return 0;
}
Вы могли попытаться использовать MultiBinding и связать дважды с тем же источником, но с различными преобразованиями на единственной привязке. Что-то как:
<SomeControl>
<SomeControl.Visibility>
<MultiBinding Converter="{StaticResource combiningConverter}">
<Binding Path="SomeProperty" Converter="{StaticResource firstConverter}"/>
<Binding Path="SomeProperty" Converter="{StaticResource secondConverter}"/>
</MultiBinding>
</SomeControl.Visibility>
</SomeControl>
Затем в 'combiningConverter' Вы помещаете логику для объединения значений, прибывающих из этих двух привязки.
Можно искать решение, подобное Josh Smith, "Передающему Преобразователи Значения по каналу".
В его статье он представляет следующее:
<local:ValueConverterGroup x:Key="statusDisplayNameGroup">
<local:IntegerStringToProcessingStateConverter />
<local:EnumToDisplayNameConverter />
</local:ValueConverterGroup>
И затем использует преобразователи мультизначения следующим образом:
<TextBlock Text="{Binding XPath=@Status,
Converter={StaticResource statusDisplayNameGroup}}" />
Надеюсь, это поможет!