我想知道如何在objective-c中实现以下功能,
我正在使用串行通信与FTDI232R调制解调器进行通信,所以我使用POSIX调用来打开,写入和读取调制解调器的路径(dev / tty / nameOfModem)。 POSIX调用是同步调用,所以在读取时我不想阻止我的主线程,因此我想在单独的线程中进行读取调用。
我不希望这个辅助线程连续运行,但只有在有东西需要读取时唤醒,并且在读完后它应该睡觉。我查看了有关为NSRunLoop提供输入源的文档并将该runloop添加到辅助线程,但无法弄清楚如何执行此操作。
提前感谢您的帮助。
答案 0 :(得分:0)
您通常有一个BOOL
表示您的运行状态,然后是一个运行日期。在做socket-y的事情时,我倾向于做类似的事情:
NSDate *beforeDate = [NSDate dateWithTimeIntervalSinceNow:.1];
while (self.isActive && [[NSRunLoop currentRunLoop] runMode: NSRunLoopCommonModes beforeDate:beforeDate]) {
beforeDate = [NSDate dateWithTimeIntervalSinceNow:.1];
}
然后当您从调制解调器断开连接时,可以将isActive设置为NO以使runloop停止运转。
虽然不是完全你想要的东西,但是threading with NSOperation上的Apple文档对你来说可能很有趣。
答案 1 :(得分:0)
您可能应该使用GCD dispatch sources。以下是直接从该文章中复制的示例代码:
dispatch_source_t ProcessContentsOfFile(const char* filename)
{
// Prepare the file for reading.
int fd = open(filename, O_RDONLY);
if (fd == -1)
return NULL;
fcntl(fd, F_SETFL, O_NONBLOCK); // Avoid blocking the read operation
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t readSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ,
fd, 0, queue);
if (!readSource)
{
close(fd);
return NULL;
}
// Install the event handler
dispatch_source_set_event_handler(readSource, ^{
size_t estimated = dispatch_source_get_data(readSource) + 1;
// Read the data into a text buffer.
char* buffer = (char*)malloc(estimated);
if (buffer)
{
ssize_t actual = read(fd, buffer, (estimated));
Boolean done = MyProcessFileData(buffer, actual); // Process the data.
// Release the buffer when done.
free(buffer);
// If there is no more data, cancel the source.
if (done)
dispatch_source_cancel(readSource);
}
});
// Install the cancellation handler
dispatch_source_set_cancel_handler(readSource, ^{close(fd);});
// Start reading the file.
dispatch_resume(readSource);
return readSource;
}