我有一些代码,我使用dispatch_semaphore_t来指示操作完成.当信号量是成员变量时,它似乎行为不正确.我将展示有效的示例代码和一个似乎不起作用的示例:
@implementation someClass
{
dispatch_semaphore_t memberSem;
dispatch_semaphore_t* semPtr;
NSThread* worker;
BOOL taskDone;
}
- (id)init
{
// Set up the worker thread and launch it - not shown here.
memberSem= dispatch_semaphore_create(0);
semPtr= NULL;
taskDone= FALSE;
}
- (void)dealloc
{
// Clean up the worker thread as needed - not shown here.
if((NULL != semPtr) && (NULL != *semPtr))
disptatch_release(*semPtr);
dispatch_release(memberSem);
}
- (void)doSomethingArduous
{
while([self notDone]) // Does something like check a limit.
[self doIt]; // Does something like process …Run Code Online (Sandbox Code Playgroud) 我有一个带有项目的ListBox,并为其分配了一个ContextMenu,其中包含三个菜单项.除了其中一个菜单项启动冗长的操作外,一切正常.我想从处理程序关闭ContextMenu,并可能显示一个沙漏光标或其他东西.
可以这样做吗?或者,我应该使用Popup吗?如果是这样,我如何使用Popup代替ContextMenu?我的假设是我必须完全管理它 - 安置和生命.
谢谢!
我试图在XCode 4中创建一个简单的模态对话框.我创建了xib,创建了NSWindowController派生类,并使其成为xib文件所有者中的类.我遇到问题的部分是物理连接窗口插座,如问题答案中所述:
为什么我必须在我的NSWindowController上调用showWindow两次10.5?
在Apple文档中:
我理解这个概念,但我无法弄清楚如何在XCode 4中实际执行此操作!我知道如何通过CTRL-drag将xib中的控件连接到类中的插座或动作.在这种情况下,我只是不知道要拖拽什么.
任何帮助赞赏.
我不确定我是以正确的方式做事,还是我把它全部搞砸了.
我有一个非常简单的测试应用程序(不是基于文档的)我创建的用于学习如何在Cocoa应用程序中使用应用程序模式对话框.
使用应用程序项目"TestModalDialog",我有一个简单的MainMenu.xib,默认视图和一个按钮,"Show Dialog",我补充说.我创建了第二个名为TheDialog.xib的XIB,它有"取消"和"确定"按钮.该xib拥有一个派生自NSWindowController的类,名为"TheDialogController"; 窗口和代表连接到控制器.
在主视图上选择"显示对话框"将启动对话框.选择"取消"或"确定"将关闭对话框.这是非常简单的代码:
// TestModalDialogAppDelegate.h
// TestModalDialog
#import <Cocoa/Cocoa.h>
@class TheDialogController;
@interface TestModalDialogAppDelegate : NSObject <NSApplicationDelegate>
{
NSWindow *window;
TheDialogController* theDialogController;
}
@property (assign) IBOutlet NSWindow *window;
- (IBAction)showDialog:(id)sender;
@end
// TestModalDialogAppDelegate.m
// TestModalDialog
#import "TestModalDialogAppDelegate.h"
#import "TheDialogController.h"
@implementation TestModalDialogAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
theDialogController= [[TheDialogController alloc] init];
}
- (void)dealloc
{
if(nil != theDialogController)
[theDialogController release];
[super dealloc];
}
- (IBAction)showDialog:(id)sender
{
if(nil == theDialogController)
{
NSAlert* alert= [NSAlert alertWithMessageText:@"Dialog Error" defaultButton:nil alternateButton:nil otherButton:nil …Run Code Online (Sandbox Code Playgroud) 我有一个工作区Application.xcworkspace,它构建了两个框架和一个使用这些框架的可执行文件.以下是它们的布局大致:
Framework_1 - 构建并输出到丑陋的DerivedData路径.
Framework_2 - 取决于Framework_1,它包含在项目的Frameworks区域中,并在"Link Binary with Libraries"构建阶段中指定,并输出到丑陋的DerivedData路径.
应用程序 - 取决于Framework_1和Framework_2,它们包含在项目的框架区域中,并在"链接二进制文件库"构建阶段中指定.输出目录再次是丑陋的DerivedData路径.
我遇到的问题是,引用框架的项目文件中的路径是DerivedData丑陋的路径 - 它们就像../../Library/Developer/XCode/DerivedData/Application-longuglyuniquestring/Build/Products/Release/Framework_1 .framework.
如果我将源复制到另一个目录,或将其检入版本控制并将其签出到另一台机器,那么这些框架路径将不再有效.他们重新生成.引用的框架在项目中显示为红色.
到目前为止,当我想在另一个文件夹中构建工作区时,我解决问题的方法是:
这个过程很繁琐,我很幸运,可以编辑项目文件.对于那些不了解我对项目文件知之甚少的同事来说,更糟糕的是,只想检查代码并进行构建.
我需要对框架的构建输出目录做些什么吗?因为建议使用丑陋的路径,所以我一直在改变它.是否有一个复制文件选项,我可以用来将这些框架放在相对于我的工作区的某个可预测的位置?
任何帮助,将不胜感激.我确信我遗漏了一些简单的东西 - 从源代码控制中检出代码或复制到另一个目录的代码不会构建是没有意义的.
我的团队有一台运行Windows Server 2008 R2 Enterprise,SP1的虚拟机,用于运行我们的夜间构建.我们正在使用Visual Studio 2012并通过从C#程序通过System.Diagnostics.Process.Start运行devenv.exe来启动构建过程.
最近我们一直在构建失败,输出日志看起来像
26>------ Build started: Project: PrjX, Configuration: Release Win32 ------
26>A task was canceled.
27>------ Build started: Project: PrjY, Configuration: Release Win32 ------
27>A task was canceled.
28>------ Build started: Project: PrjZ, Configuration: Release Win32 ------
28>A task was canceled.
Run Code Online (Sandbox Code Playgroud)
有时它可能只有一个或两个项目,其他时间超过100. FWIW,我们构建了三个解决方案,第一个是失败的.后面的两个正确构建.
从查找有关该问题的信息,我知道输出是由于异常System.Threading.Tasks.TaskCanceledException被捕获到VS 2012中的某个地方.除此之外,我不知道发生了什么.我怀疑它可能与并行项目构建有关.到目前为止,我只看到另一篇与此问题相关的帖子 - http://social.msdn.microsoft.com/Forums/en-US/306f5a10-db72-4992-9d49-20ad1577ed05/visual-studio-2013-error -a-task-was-cancel?forum = visualstudiogeneral "回答"真的不是答案....
任何帮助或见解将不胜感激.
我将通过连接发送多种缓冲区类型.为了简单起见,想象一下这样的架构:
namespace MyEvents;
table EventOne
{
id:uint;
timestamp:ulong;
adress:string;
}
table EventTwo
{
id:uint;
timestamp:ulong;
strength:float;
}
union Events {EventOne, EventTwo}
table EventHolder
{
theEvent:Events;
}
root_type EventHolder;
Run Code Online (Sandbox Code Playgroud)
我为C++和C#生成了所需的文件,并在我各自的项目中根据需要包含它们.
以下是我在C++中编码事件的方法 - 这里是EventOne类型的事件:
...
uint32_t anId(645);
uint64_t aTimestamp(1234567);
string anAddress("00::00::45::56::47::e5");
flatbuffers::FlatBufferBuilder builder;
auto addressOffset= builder.CreateString(anAddress);
auto eventOneOffset= MyEvents::CreateEventOne(builder, anId, aTimestamp, addressOfset);
// Here is where I am confused - how to create the EventHolder object.
// Original code I posted about - commented out, but has error.
//auto eventHolderOffset= MyEvents::CreateEventHolder(builder, MyEvents::Events_EventOne, …Run Code Online (Sandbox Code Playgroud) 我正在将无代码 KEXT 迁移到无代码 DEXT。我观看了 WWDC 视频并阅读了 Apple 开发者网站上的大量信息。我遇到的困难不是找到要做什么,而是找到如何开始。带有示例项目的不错的教程会有所帮助。
在我的无代码 KEXT 中,对于 4 个独立的设备,每个设备都有 IOUSBDevice 和 IOUSBInterface 的 IOKitPersonalities。KEXT 允许我将我的设备与我的“驱动程序”相匹配,这样 Apple HID 驱动程序就不会抓住它们。我希望在无代码 DEXT 中做相同或类似的事情。
到目前为止,我已经在应用程序中创建了一个名为 MyUsbDriver 的 DriverKit 目标(用于 DriverKit.framework),并添加了 USBDriverKit.framework。这会向我的项目添加一个文件夹 MyUsbDriver,其中包含文件 MyUsbDriver.cpp、MyUsbDriver.iig、Info.plist 和 MyUsbDriver.entitlements。这是我的问题:
看起来 IOService 的默认子类适用于 USB - 这与 KEXT 中的 IOClass 相同。真的吗?
DEXT 世界中的 IOUSBHostInterface 是否等同于 KEXT 世界中的 IOUSBInterface?
IOUSBHostDevice 是否等同于 IOUSBDevice?
对于无代码 DEXT,我需要对 .cpp 或 .iig 执行任何操作吗?我的大部分工作不是要在 plist 和 entitlements 文件中完成吗?
我的 MyUsbDriver 目标的框架和库中是否需要 USBDriverKit.framework?
我在哪里可以找到如何完成此迁移的合适示例?
任何帮助将不胜感激。
更新:
使用答案中的示例和其他链接,我能够得到一些东西。我确实有一个“Doh”时刻:我最初的测试项目类型是命令行工具,但我永远无法嵌入 DEXT。我几乎只是手工编辑了 pbxproj 文件。然而,在查看 Scott Knight 的原始示例 USBApp …
我有一个用于 USB 设备驱动程序的 macOS 系统扩展。当我禁用 SIP 并使用我的 cosign 身份(使用终端的“安全查找身份”从我的 Apple ID 生成)手动签名时,它会起作用 - 如此处所述:https : //github.com/knightsc/USBApp/issues/1
我可以激活和停用 dext 并在激活时将其与设备一起使用 - 我所做的和最终的例子如下:
和这里:
激活无代码 DEXT 后获取 OSSystemExtensionErrorCodeSignatureInvalid
我获得了 Apple 的授权,并按照他们概述的步骤创建了一个配置文件,然后下载并安装了它。然后我按照 Apple 的授权电子邮件中引用的步骤手动签署应用程序:https : //help.apple.com/xcode/mac/current/#/dev1bf96f17e
我重建了我的应用程序并停用了我的驱动程序的所有现有实例。当我尝试激活新驱动程序时,激活请求失败并显示权利错误:“Error Domain=OSSystemExtensionErrorDomain Code=8”,我知道这表明存在权利/签名问题。
使用 Apple 的配置文件对我的应用程序和驱动程序进行签名的正确方法是什么?
我需要更新我的权利文件吗?这是我现有的文件:
应用程序
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
<key>com.apple.developer.system-extension.install</key>
<true/>
<key>com.apple.developer.system-extension.uninstall</key>
<true/>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
右旋
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" …Run Code Online (Sandbox Code Playgroud) macos code-signing-entitlements macos-catalina macos-system-extension driverkit
我是WPF的新手,所以我认为这很简单.我有一个带有列表框和按钮的表单.在按钮的单击处理程序中,我迭代地执行一些生成字符串的操作,我希望将它放在列表框中.列表框的xaml就像
<ListBox Height="87" Margin="12,0,12,10" Name="lbxProgress" VerticalAlignment="Bottom">
<ListBox.BindingGroup>
<BindingGroup Name="{x:Null}" NotifyOnValidationError="False" />
</ListBox.BindingGroup>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
点击处理程序就像
private void btn_Click(object sender, RoutedEventArgs e)
{
List<String> lstrFiles= new List<String>(System.IO.Directory.GetFiles ("C:\\temp", "*.tmp");
foreach(string strFile in lstrFiles)
lbxProgress.Items.Add(strFile);
}
Run Code Online (Sandbox Code Playgroud)
非常直截了当.由于我的实际操作很长,我希望列表框能够像我每次更新一样更新 - 如何在每次添加时动态更新框?
macos ×4
c# ×2
cocoa ×2
driverkit ×2
objective-c ×2
wpf ×2
c++ ×1
contextmenu ×1
devenv ×1
flatbuffers ×1
frameworks ×1
iokit ×1
ios ×1
listbox ×1
modal-dialog ×1
nsthread ×1
popup ×1
refresh ×1
semaphore ×1
xaml ×1
xcode ×1
xcode4 ×1
xib ×1