Это зависит от того, что делают эти потоки. Хотя передача данных между потоками относительно прямо вперед, пробуждение потоков для обработки данных может быть более сложным. Когда вы разрабатываете связь с парадигмой потока / соединения, ваш поток почти все время застревает в методе Read, например Socket.Receive . Хотя в этом состоянии другие потоки не могут действительно разбудить этот поток, чтобы он отправил данные, которые они хотят отправить. Одно из решений заключается в том, чтобы каждый раз получать время приема и проверять, есть ли у него данные для передачи, но это просто отстой.
Еще одна идея состоит в том, чтобы иметь 2 потока на один сокет, один для отправки одному для приема. Но тогда все преимущества наличия потока в одном соке исчезли: вы больше не можете иметь простое управление состоянием «сессии» в коде потока, у вас есть состояние, разделенное между двумя потоками, и это просто беспорядок.
Вместо этого вы можете вместо этого использовать async Receive: поток сокета помещает BeginReceive , а затем ждет события. Событие сигнализируется либо завершением приема , либо в очереди отправки, которая имеет что-то «отброшенное» (или вы можете ждать по нескольким событиям, в том числе и в основном). Теперь это сработает, но в данный момент у вас есть полупородная часть части aync part one-thread -per-socket. Если вы пойдете по этому пути, я бы прошел целых 9 ярдов: сделайте сервер полностью асинхронным.
Лучшим решением будет переход на асинхронный режим. Вместо обмена данными между потоками процедуры завершения работают с заблокированными данными. Connection1 BeginReceive завершается, когда он получает данные, вы анализируете полученные данные и анализируете контент, а затем решаете отправить его на Connection2. Таким образом, вы вызываете BeginSend на сокет Connection2, то есть поток , который получил данные, также отправляет данные . Это намного эффективнее, чем модель нити за сокет, но большой недостаток - это просто сложно, если вы знакомы с асинхронным и многопоточным программированием.
См. Пример гнезда асинхронного сервера и Пример асинхронного клиентского гнезда для праймера.
Примечания:
git status --ignored
.gitignore
файлы? ") git clean -ndX
работы над мерзавцами старшего возраста, отображаясь предварительный просмотр из того, какие проигнорированные файлы могли быть удалены (ничего не удаляя) Также интересный (упомянутый в [1 127] ответ qwertymk ), можно также использовать git check-ignore -v
команда, по крайней мере, на Unix ( не работает на сессии CMD Windows )
git check-ignore *
git check-ignore -v *
, второй отображает фактическое правило .gitignore
, который делает файл, который будет проигнорирован в мерзавце repo.
На Unix, с помощью" , Что расширяется до всех файлов в текущем каталоге рекурсивно? " и bash4 +:
git check-ignore **/*
(или find -exec
команда)
Исходный ответ 42009)
git ls-files -i
должен работать, кроме [1 131], его исходный код указывает:
if (show_ignored && !exc_given) {
fprintf(stderr, "%s: --ignored needs some exclude pattern\n",
argv[0]);
exc_given
?
оказывается, что этому нужен еще один параметр после -i
для фактического списка чего-либо:
Попытка:
git ls-files -i --exclude-from=[Path_To_Your_Global].gitignore
(но это только перечислило бы Ваш , кэшировался (непроигнорированный) объект, с фильтром, так, чтобы был не совсем, что Вы хотите)
<час>Пример:
$ cat .git/ignore
# ignore objects and archives, anywhere in the tree.
*.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git ls-files --ignored \
--exclude='Documentation/*.[0-9]' \
--exclude-from=.git/ignore \
--exclude-per-directory=.gitignore
<час> На самом деле, в моем 'gitignore' файле (названный 'исключают'), я нахожу командную строку, которая могла помочь Вам:
F:\prog\git\test\.git\info>type exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
Так....
git ls-files --others --ignored --exclude-from=.git/info/exclude
git ls-files -o -i --exclude-from=.git/info/exclude
git ls-files --others --ignored --exclude-standard
git ls-files -o -i --exclude-standard
должен добиться цели.
, Как упомянуто в эти страница справочника , --others
ls-файлов является важной частью, чтобы показать, что Вы не кэшировались, не фиксировавший, обычно проигнорированные файлы.
--exclude_standard
не просто ярлык, но и способ включать весь , стандарт "проигнорировал шаблоны" настройки.
exclude-standard
Добавляют стандартные исключения мерзавца:.git/info/exclude
,.gitignore
в каждом каталоге, иuser's global exclusion file
.
Хотя в целом правильное решение не работает во всех обстоятельствах. Предположим, что каталог репозитория такой:
# ls **/*
doc/index.html README.txt tmp/dir0/file0 tmp/file1 tmp/file2
doc:
index.html
tmp:
dir0 file1 file2
tmp/dir0:
file0
и .gitignore, например:
# cat .gitignore
doc
tmp/*
Это игнорирует каталог doc
и все файлы ниже tmp
.
Git работает должным образом, но данная команда для вывода списка игнорируемых файлов - нет.
Давайте посмотрим, что сообщает git:
# git ls-files --others --ignored --exclude-standard
tmp/file1
tmp/file2
Обратите внимание, что doc
отсутствует в списке.
Вы можете получить это с помощью:
# git ls-files --others --ignored --exclude-standard --directory
doc/
Обратите внимание на дополнительную опцию - directory
.
Насколько мне известно, не существует одной команды для вывода списка всех игнорируемых файлов сразу.
Но я не знаю, почему tmp / dir0
вообще не отображается.
Главной проблемой является перестановка функция. Когда он называется неявно всегда возвращает только одно значение.
Пролог - это язык, который всегда пытается доказать истинность утверждения, выводя его с помощью приведенных аксиом (фактов или правил).
пермь
не является функцией в смысле процедурного программирования. perm
- предикат, о котором рассказываем пролог двух вещей:
Список
является перестановкой [H 'Perm]
при наличии списка Rest
таким образом, что Rest
получается удалением H
из List
, а Rest
является перестановкой Perm
. При запросе, является ли какой-либо список перестановкой другого, prolog попытается применить эти шаги деривации (рекурсивно), чтобы доказать это. Если эта рекурсия заходит в тупик, т.е. оператор, который не может быть доказан, так как к нему не могут быть применены никакие правила, он возвращается назад.
-121--3572409- Нет простого решения, необходимо подкласс NSTextField
, чтобы сделать то, что вы хотите. Вам нужно будет научиться работать с подклассированием, если вы хотите сделать что-нибудь полезное в какао.
Текстовые поля могут быть относительно сложными для подкласса, поскольку NSTextField
использует отдельный объект NSTextView
, называемый редактором полей, для обработки фактического редактирования. Это текстовое представление возвращается объектом NSWindow
для NSTextField
и повторно используется для всех текстовых полей на странице.
Как и любой подкласс NSResponder
, NSTextField
отвечает на методы -acceptsFirstResponder
и -becOmeFirstResponder
. Они вызываются в том случае, если окно хочет сфокусировать внимание на конкретном элементе управления или представлении. Если вы вернете YES
из обоих этих методов, то ваш элемент управления/вид будет иметь статус первого ответчика, что означает, что это активный элемент управления. Однако, как уже упоминалось, NSTextField фактически дает редактору поля статус первого ответчика при щелчке, поэтому необходимо сделать что-то подобное в подклассе NSTextField
:
@implementation MCTextField
- (BOOL)becomeFirstResponder
{
BOOL result = [super becomeFirstResponder];
if(result)
[self performSelector:@selector(selectText:) withObject:self afterDelay:0];
return result;
}
@end
Это сначала вызывает реализацию суперкласса -becomeFirstResponder
, который выполнит тяжелую работу по управлению редактором поля. Затем вызывается -selectText:
, который выбирает весь текст в поле, но делает это после задержки в 0 секунд, которая будет задерживаться до следующего запуска через цикл событий. Это означает, что выбор будет выполнен после полной настройки редактора полей.
Еще один довольно чистый вариант (Не предполагается игра слов.):
git clean -ndX
Объяснение:
$ git help clean
git-clean - Remove untracked files from the working tree
-n, --dry-run - Don't actually remove anything, just show what would be done.
-d - Remove untracked directories in addition to untracked files.
-X - Remove only files ignored by Git.
Примечание: В этом решении не будут отображаться пропущенные файлы, которые уже были удалены.