Вы можете сделать это с помощью памяти кучи (через вызов malloc () ), как и другие ответы, описанные здесь, но вы всегда должны управлять памятью (используйте функцию free () каждый раз, когда вы вызываете свою функцию). Вы также можете сделать это со статическим массивом:
char* returnArrayPointer()
{
static char array[SIZE];
// do something in your array here
return array;
}
Вы можете использовать его, не беспокоясь об управлении памятью.
int main()
{
char* myArray = returnArrayPointer();
/* use your array here */
/* don't worry to free memory here */
}
В этом примере вы должны использовать статическое ключевое слово в определение массива, чтобы установить продолжительность жизни массива в приложении, поэтому он не будет уничтожен после оператора return. Разумеется, таким образом вы занимаете байты SIZE в своей памяти на весь срок службы приложения, поэтому его размер будет правильным!
Вы блокируете поток пользовательского интерфейса. Вы не должны этого делать. Опции:
join
в первых трех. Полезно с точки зрения создания другого ресурса, но достаточно простого. AtomicInteger
, чтобы убедиться, что вы не запускаете модель памяти и проблемы с условиями гонки. Запустите счетчик на 3 и уменьшите его в конце каждого потока. Когда последний поток завершит свою работу (т. Е. Его декремент ставит счетчик на 0), сделайте , чтобы он перешел в пользовательский интерфейс. (Вторая пуля может быть тем, что вы делали уже ... Трудно сказать наверняка, учитывая описание просто «Я использовал счетчик».)
Пока Я полностью понимаю, откуда вы пришли с точки зрения потока управления приложения, который намного сложнее в мире, управляемом событиями, так как работает Swing (и так работает большинство других интерфейсов пользовательского интерфейса). Вы просто не можете блокировать поток пользовательского интерфейса. (Это также почему C # 5 делает все проще на уровне language ...)
Выполнение любой операции блокировки в событии Dispatch Thread приведет к тому, что ваш GUI перестанет реагировать и перестанет перекрашиваться. Вот почему длительные операции должны выполняться в фоновом потоке.
Кажется, вы знаете, что вам нужно делать что-то в фоновом потоке, но все же хотите заблокировать EDT. Вы не должны этого делать. Вместо этого вы хотите получить обратный вызов - некоторый код, который будет запущен после завершения фоновых потоков.
Уже предоставленный механизм обратного вызова, доступный в Java 6+, - SwingWorker
, Внесите работника, поместив join()
s (и start()
s) в метод doInBackground()
. Затем любые операции Swing, которые вы хотите сделать после, могут войти в done()
.
join()
заставляет поток ждать до тех пор, пока "объединенный" нить заканчивается ..., что может занять относительно много времени. Ущерб в блокировке заключается в том, что в течение этого времени не обрабатываются другие события пользовательского интерфейса; то есть пользовательский интерфейс становится невосприимчивым. (Длительность «длительное время» является субъективной, но вы узнаете ее, когда увидите ее.)
– Stephen C
16 November 2011 в 02:27
SwingUtilities.invokeLater
из того, что последний раз заканчивается, чтобы вызватьdoSomething
. В принципе, вы не можете i> делать что-то долгое время в потоке пользовательского интерфейса. – Jon Skeet 16 November 2011 в 01:45